首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8可选

Java 8可选
EN

Stack Overflow用户
提问于 2016-05-19 15:38:21
回答 1查看 2.8K关注 0票数 2

我想检查特定对象的大小是否大于0。如果它大于0,那么我希望创建一个可选对象,如果不是,则返回一个可选的空对象。这是java代码的长版本:

代码语言:javascript
复制
if(fooA.size>0) {
    return Optional.of(new Foo());
} else {
    return Optional.empty();
}

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

EN

回答 1

Stack Overflow用户

发布于 2016-05-19 21:21:50

祈使方式

如果您决定坚持执行命令式编程,那么您的If -否则构造就会很好。它的可读性、可理解性以及你只需减少代码行(除非你为此付费并想玩游戏系统)就什么都得不到了。

(condition)?(true-branch):(false-branch)结构很好,但是如果它变得太复杂,它可能会变得很难读。一些自动格式的规则把它的每个部分分成不同的行。所以在使用它之前想一想。

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

代码语言:javascript
复制
return newOptionalFoo(fooA.size > 0);

...

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

如果要将其压缩为单行命令样式,请执行以下操作:

代码语言:javascript
复制
return condition ? Optional.of(new Foo()) : Optional.empty();    

功能方式

如果您想使用函数式程式设计,当函数式程式设计是可以避免的时,不应将函数式程式设计与命令式程式设计混为一谈。一种正确的功能方法是将fooA包装成可选的、条件上的过滤器并映射到Foo。因此,如果不满足条件,则将其映射到空的Optional。我更喜欢这种方式。

代码语言:javascript
复制
return Optional.of(fooA).filter(f -> f.size > 0).map(f -> new Foo());

或者,您可以创建Optional of Foo并使用筛选器,以便如果筛选条件不匹配,则可选选项变为空:

代码语言:javascript
复制
return Optional.of(new Foo()).filter(f -> fooA.size > 0);

但是,这将创建一个Foo实例,而不管是否为true或false。如果您想要延迟实例化,因为创建Foo很昂贵,那么您可以使用Supplier并在过滤后映射到Foo

代码语言:javascript
复制
return Optional.of((Supplier<Foo>) Foo::new)
               .filter(s -> fooA.size > 0)
               .map(Supplier::get)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37328017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档