在 Java 中声明 lambda 数组

2022-09-04 05:52:25

我想创建一个 lambda 数组。问题在于 lambda 可能彼此不同。例:

private interface I0 {
    int interface0(int a, int b);
}

private interface I1 {
    int interface1(double d);
}

现在,如何声明一个可以同时包含 I0 和 I1 的列表?

List<Object> test = Arrays.asList(
        (int a, int b) -> a + b,
        (double d) -> d * 2
);

显然不起作用。Object


答案 1

您必须先将 lambda 表达式分配给函数接口类型的变量。

否则,编译器无法推断这些 lambda 表达式的类型。

I0 i0 = (int a, int b) -> a + b;
I1 i1 = (double d) -> (int) (d * 2);
List<Object> test = Arrays.asList(
    i0,
    i1
);

也就是说,我不确定将这些lambda表达式存储在.如果不将它们转换回各个功能接口类型,则无法使用它们。List<Object>


答案 2

您可以像这样投射到相应的接口:

List<Object> test = Arrays.asList(
    (I0) (int a, int b) -> a + b,
    (I1) (double d) -> (int) (d * 2)
);

尽管这更短,但我也会考虑Eran的答案,也许它更具可读性,更容易理解(如果有更多的功能)。我也看不到这种结构的用例......

它变得更短(不一定更好):

List<Object> test = Arrays.asList(
    (I0) (a, b) -> a + b,
    (I1) d -> (int) (d * 2)
);

推荐