返回类型为 void 的 Lambda 表达式可以使用包装器进行编译,但不能使用原始类型进行编译

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)

这在JLS 15.27.3 中有介绍

如果函数类型的结果为 void,则 lambda 主体是语句表达式(第 14.8 节)或与 void 兼容的块。

5既不是语句也不是 void 兼容块。所以A a = () -> 5;不会编译。

这种限制的原因是返回空值的 lambda 只有在它通过副作用运行时才有意义。简单地返回一个值 like() -> 5没有副作用,因此这样的 lambda 表达式绝对是一个错误。

  • 注意:单行“5;”(在方法内,而不是 lambda)也不会编译 (3认同)