通过Lambdas自行执行匿名函数

Alj*_*yer 7 java lambda java-8 self-executing-function

在javascript中,有创建匿名函数并立即调用它的常见模式(通常这称为自执行匿名函数立即调用的函数表达式).

使用Java 8 lambdas,有没有一种标准的方法来复制这种行为?有点像(() -> doSomething())().

这个问题基本上问了同样的问题,但对于Java 7.我明确地寻找使用lambdas的构造.

Cra*_*tis 13

并非没有声明类型.由于Java是静态类型语言,并且函数不是一等公民,因此编译器需要知道lambda的类型.函数不能只是自由浮动,它总是需要与类或类的实例相关联.

Runnable r = () -> {
    System.out.println("Hello world!");
};
r.run();
Run Code Online (Sandbox Code Playgroud)

但是:您可以将lambda转换为Runnable类型,并为编译器提供有关@FunctionalInterface您正在实现的类型的提示:

((Runnable)() -> {
    System.out.println("Hello world!");
}).run();
Run Code Online (Sandbox Code Playgroud)

或者没有括号,这使它成为一个单行:

((Runnable)() -> System.out.println("Hello world!")).run();
Run Code Online (Sandbox Code Playgroud)

我想这就像你会得到的那样接近!

  • 无需指定目标类型即可支持:`{System.out.println("Hello world!"); `或没有花括号:`System.out.println("Hello world!");` (4认同)
  • @Aljoscha Meyer:"Runnable"只是一个界面,就像其他任何界面一样. (2认同)
  • @Aljoscha Meyer:这没有任何意义.这里显示的"自执行lambda"是一个表达式,就像封装的方法调用一样,但它仍然返回`void`,所以它不适用于方法参数.但是,如果函数求值为某个值,则封装表达式也会这样做,因此您可以使用原始表达式.好吧,我希望这个框架值得在这种奇怪的限制下发展...... (2认同)