我想检查特定对象的大小是否大于0。如果它大于0,那么我希望创建一个可选对象,如果不是,则返回一个可选的空对象。这是java代码的长版本:
if(fooA.size>0) {
return Optional.of(new Foo());
} else {
return Optional.empty();
}有没有办法使用java 8的可选库将其压缩成一行呢?
发布于 2016-05-19 21:21:50
祈使方式
如果您决定坚持执行命令式编程,那么您的If -否则构造就会很好。它的可读性、可理解性以及你只需减少代码行(除非你为此付费并想玩游戏系统)就什么都得不到了。
(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包装成可选的、条件上的过滤器并映射到Foo。因此,如果不满足条件,则将其映射到空的Optional。我更喜欢这种方式。
return Optional.of(fooA).filter(f -> f.size > 0).map(f -> new Foo());或者,您可以创建Optional of Foo并使用筛选器,以便如果筛选条件不匹配,则可选选项变为空:
return Optional.of(new Foo()).filter(f -> fooA.size > 0);但是,这将创建一个Foo实例,而不管是否为true或false。如果您想要延迟实例化,因为创建Foo很昂贵,那么您可以使用Supplier并在过滤后映射到Foo。
return Optional.of((Supplier<Foo>) Foo::new)
.filter(s -> fooA.size > 0)
.map(Supplier::get)https://stackoverflow.com/questions/37328017
复制相似问题