相关疑难解决方法(0)

为什么返回类型的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 Stream forEach方法的行为有所不同?

根据我对java 8 lambda表达式的理解,如果我们在花括号中不包含" - >"之后的代码,那么将隐式返回该值.但是在下面的示例中,forEach方法expect Consumer和expression返回值,但编译器没有在Eclipse中给出错误.

List<StringBuilder> messages = Arrays.asList(new StringBuilder(), new StringBuilder());

messages.stream().forEach(s-> s.append("helloworld"));//works fine 

messages.stream().forEach((StringBuilder s)-> s.append("helloworld")); //works fine 

messages.stream().forEach(s-> s); // doesn't work , Void methods cannot return a value

messages.stream().forEach(s-> s.toString()); // works fine

messages.stream().forEach(s-> {return s.append("helloworld");}); // doesn't work , Void methods cannot return a value

messages.stream().forEach((StringBuilder s)-> {return s.append("helloworld");});  // doesn't work , Void methods cannot return a value
Run Code Online (Sandbox Code Playgroud)

s.append返回StringBuilders.toString()返回,String但lambda将其视为void.

我在这里错过了什么?当我们在对象上调用方法时,为什么编译器没有给出错误?

java foreach lambda functional-programming java-8

8
推荐指数
2
解决办法
2481
查看次数

标签 统计

java-8 ×2

foreach ×1

functional-programming ×1

java ×1

lambda ×1