Java 8可选

我想检查一个特定的对象大小是否大于0.如果它大于0然后我想创建一个可选对象,如果没有,那么我想返回一个Optional空。 这是java代码的长版本:

if(fooA.size>0) { return Optional.of(new Foo()); } else { return Optional.empty(); } 

有没有办法使用java 8的可选库将其压缩成一行?

有没有办法使用java 8的可选库将其压缩成一行?

如果您坚持使用Optional类,则可以使用Optional.ofNullable() ,如果不满足条件,则将其传递为null

 return Optional.ofNullable(fooA.size > 0 ? new Foo() : null); 

但是请注意(正如Holger 正确指出的那样 )使用Optional类并没有比使用三元替换if / else语句更有显着优势(因为tobias_k和Holger都在注释中完成):

 return fooA.size > 0 ? Optional.of(new Foo()) : Optional.empty(); 

1第一行稍短,我通常认为这是一个优点,但在这种情况下绝对无关紧要 ,因为长度差异可以忽略不计。

势在必行

如果你决定坚持命令式编程,那么if-else结构就像你的一样好。 它的可读性,可理解性,你只需简单地减少代码行就可以获得任何东西(除非你得到报酬并希望游戏系统)。

(condition)?(true-branch):(false-branch)构造很好但如果它变得太复杂可能会变得很差。 一些自动格式规则无论如何都将它的每个部分分成不同的行。 所以在使用之前要考虑一下

将创建放入单行的最简单方法是将实例化重构为单独的方法并调用它:

 return newOptionalFoo(fooA.size > 0); ... private Optional newOptionalFoo(boolean condition) { if(condition) { return Optional.of(new Foo()); } else { return Optional.empty(); } } 

如果你想将它浓缩为单行 – 命令式 – 请执行以下操作:

 return condition ? Optional.of(new Foo()) : Optional.empty(); 

function方式

如果您想使用函数式编程,则在可避免的情况下不应混合function和命令式编程。 一个正确的function方法是将fooA包装到一个Optional,过滤条件并映射到Foo 。 因此,如果未满足条件,则将其映射到空的Optional 。 我更喜欢这种方式。

 return Optional.of(fooA).filter(f -> f.size > 0).map(f -> new Foo()); 

或者,您可以创建OptionalFoo并使用filter,以便在过滤条件不匹配时,可选项变为空:

 return Optional.of(new Foo()).filter(f -> fooA.size > 0); 

但这会创建一个Foo的实例,无论条件是真还是假。 如果你想进行延迟实例化,因为创建一个Foo是昂贵的,你可以使用一个Supplier并在过滤后映射到Foo

 return Optional.of((Supplier) Foo::new) .filter(s -> fooA.size > 0) .map(Supplier::get)