相关疑难解决方法(0)

为什么消费者接受语句体而不是表达体的lambdas?

以下代码令人惊讶地成功编译:

Consumer<String> p = ""::equals;
Run Code Online (Sandbox Code Playgroud)

这个也是:

p = s -> "".equals(s);
Run Code Online (Sandbox Code Playgroud)

但是这会因boolean cannot be converted to void预期错误而失败:

p = s -> true;
Run Code Online (Sandbox Code Playgroud)

使用括号修改第二个示例也会失败:

p = s -> ("".equals(s));
Run Code Online (Sandbox Code Playgroud)

它是Java编译器中的错误还是我不知道的类型推断规则?

java lambda type-inference java-8

61
推荐指数
3
解决办法
4579
查看次数

为什么返回类型的Java方法引用与Consumer接口匹配?

我对以下代码感到困惑

class LambdaTest {
    public static void main(String[] args) {
        Consumer<String>         lambda1 = s -> {};
        Function<String, String> lambda2 = s -> s;

        Consumer<String>         lambda3 = LambdaTest::consume; // but s -> s doesn't work!
        Function<String, String> lambda4 = LambdaTest::consume;
    }

    static String consume(String s) { return s;}
}
Run Code Online (Sandbox Code Playgroud)

我原本期望lambda3的赋值失败,因为我的consume方法与Consumer Interface中的accept方法不匹配 - 返回类型不同,String与void.

此外,我一直认为Lambda表达式和方法引用之间存在一对一的关系,但显然并非如我的示例所示.

有人可以向我解释这里发生了什么吗?

java-8

19
推荐指数
2
解决办法
3056
查看次数

标签 统计

java-8 ×2

java ×1

lambda ×1

type-inference ×1