如何在 Java 中定义和调用内联 lambda 表达式

zak*_*mck 3 lambda java-8

我想做这样的事情:

{ param -> if ( <condition over param> ) process ( param ) } ( provider () );
Run Code Online (Sandbox Code Playgroud)

即, param 是一个方法返回的值(比方说,它需要很长时间才能运行,所以我只想调用它一次)并且我只想在它满足条件时传递这样的值。

替代方案是:

Param param = provider(); if ( <cond> ) process ( param );
Run Code Online (Sandbox Code Playgroud)

但是基于 lambda 的版本,如果我能让它工作的话,会更短。上面的代码不能用 Java 编译,我不知道我在想什么是可能的,以及如何。

Hol*_*ger 5

好吧,你可以做类似的事情

                                        // use Type::process for a static method
Stream.of(provider()).filter( «cond» ).forEach(this::process);
Run Code Online (Sandbox Code Playgroud)

尽管这里的普通命令式语句确实没有任何好处

如果要限制新引入的变量的作用域,可以创建一个块。

{ Param param = provider(); if( «cond» ) process(param); }
Run Code Online (Sandbox Code Playgroud)

而且,作为旁注,使用这种传统构造进行调试会容易得多。


zak*_*mck 2

感谢大家的回复。我发现了一种类似于@Holger 建议的方法:

Optional.of ( provider() ).map ( v -> { if ( <cond> ) process ( v ); return null; } )
Run Code Online (Sandbox Code Playgroud)

(仅当 process() 返回 void 时才需要返回)。我同意定义中间变量会更快,并且可能我最终会这样做。然而,一定有一些心理原因为什么我更喜欢上述的功能形式。当它们很多时,它们看起来写起来更快,也许是因为您不需要考虑新的变量名称(如果涉及不同的类型,则需要多个变量定义)。