Java 8可选

时间:2016-05-19 15:38:22

标签: java java-8 optional

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

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

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

2 个答案:

答案 0 :(得分:7)

  

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

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

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

但是请注意(使用Optional Holger correctly states)使用Optional类没有任何重要的 1 优势,而只是将if / else语句替换为三元组(tobias_k和Holger都在their comments完成):

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

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

答案 1 :(得分:4)

势在必行

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

(condition)?(true-branch):(false-branch)构造很好但如果太复杂,可能会变得难以理解。一些自动格式规则无论如何都将它的每个部分放在单独的行中。所以在使用之前要先思考

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

return newOptionalFoo(fooA.size > 0);

...

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

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

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

功能方式

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

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

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

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

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

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