Ser*_*maz 10 java lambda java-8
interface A {
void s();
}
public static void main(String[] args) {
A a = () -> 5; // DOES NOT compile
A b = () -> new Integer(5); // does compile
A c = () -> Stream.of(1, 2, 3); // does compile
}
Run Code Online (Sandbox Code Playgroud)
第一行不编译而第二行和第三行编译的原因是什么?
Mis*_*sha 14
包装与原始不是原因。以下内容也不会编译:
Integer i = 5;
A b = () -> i;
Run Code Online (Sandbox Code Playgroud)
如果函数类型的结果为 void,则 lambda 主体是语句表达式(第 14.8 节)或与 void 兼容的块。
5既不是语句也不是 void 兼容块。所以A a = () -> 5;不会编译。
这种限制的原因是返回空值的 lambda 只有在它通过副作用运行时才有意义。简单地返回一个值 like() -> 5没有副作用,因此这样的 lambda 表达式绝对是一个错误。