我对以下代码感到困惑
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 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返回StringBuilder并s.toString()返回,String但lambda将其视为void.
我在这里错过了什么?当我们在对象上调用方法时,为什么编译器没有给出错误?