Java映射到对象而不是另一个对象的现有方法可选<>吗?
我熟悉Optional.map(mapper)
,它将可选对象映射到其他对象。因此,如果我想用可选的Foo
和非可选的Bar
做一些事情,我可以做:
Optional<Foo> foobar = foo.map(foo -> foo.addBar(bar))
这有点像:
Optional<Foo> foobar = foo.isPresent() ? Optional.of(foo.get().add(bar)) : Optional.empty();
但我看到了一种反复出现的模式,bar
是可选的。我要复制的功能如下所示:
Foo foobar = bar.isPresent() ? foo.add(bar.get()) : foo;
换句话说,如果其他事物存在,让我用它来做一些关于我现有事物的事情;否则,就把我现有的东西还给我
我可以想象自己制作Optionals.doIfOtherPresent(T object, Optional<U> optional, BiFunction<? super T, ? super U, ? extends T> fn)
。我会这样使用它:
Foo foobar = doIfOtherPresent(foo, bar, foo::add);
Java库中已经有这样的东西了吗
# 1 楼答案
我认为从
Optional<Bar>
开始的其他答案对于很多情况都很好。如果在某个阶段有条件地需要foo.addBar
在涉及Foo
的较长方法链中,该方法也可以适用于那里(尚未测试):# 2 楼答案
你要找的是
Optional.flatMap()
以下构造:
Foo result = optionalBar.isPresent() ? optionalFooFromBar( optionalBar.get() ) : foo;
可以改写为:
Foo result = optionalBar.flatMap( bar -> optionalFooFromBar( bar ) ).orElse( foo );
请注意,您保存了整整两个字符
# 3 楼答案
使用
bar
而不是foo
似乎可以简化它:bar.map(b -> foo.map(f -> f.add(b)))
如果bar
存在,则返回Optional<Optional<Foo>>
即“存在”如果
bar
不存在,则.orElse(foo)
还原为原始Optional<Foo>
(否则返回foo.map(f -> f.add(b))
)# 4 楼答案
根据您提供的示例,如果
bar
存在,您似乎希望应用操作foo.add
,否则返回foo
:因此,我想说它太短了,不值得为它创建一个实用的方法
optBar
有一个当前状态,我们应用map
操作orElse
返回映射的值李>optBar
有一个缺席状态,orElse
方法返回提供的默认值f
李>另一件事,您是首先以
Optional<Bar>
的形式获得结果,还是手动将Bar
包装成可选的?如果是后者,我可能只会使用一个简单的if
语句,这将是理想的解决方案,即