![](/img/trans.png)
[英]Best way to convert Map<Object, Optional<Object>> to Map<Object, Object>?
[英]Existing way to Java map Optional<> onto object instead of to another object?
我熟悉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 库中是否已经有一些东西可以做到这一点?
使用bar
而不是foo
似乎简化了它:
Foo foobar = bar
.map(b -> foo.map(f -> f.add(b)))
.orElse(foo)
.orElse(null); // if foo is not present
bar.map(b -> foo.map(f -> f.add(b)))
返回Optional<Optional<Foo>>
,如果存在bar
,则为“present”。
.orElse(foo)
如果bar
不存在则恢复为原始的Optional<Foo>
(否则返回foo.map(f -> f.add(b))
)。
根据您提供的示例,如果存在bar
,则似乎您要应用操作foo.add
,否则返回foo
:
Foo foobar = bar.isPresent() ? foo.add(bar.get()) : foo;
因此,我会说它太短了,不值得为它创建一个实用方法。
Foo foobar = optBar.map(f::add).orElse(f); // map to Foo if bar is present else return `f`
optBar
具有当前状态,我们应用map
操作, orElse
返回该映射值。 optBar
具有缺席状态,则orElse
方法返回提供的缺省值f
。 另一件事,你是首先将结果作为Optional<Bar>
获得,还是手动将Bar
包装成Optional? 如果它是后者我可能只是使用一个简单的if
语句,这将是理想的解决方案,即
Foo foo = new Foo();
if(bar != null) foo = foo.add(bar);
我认为从Optional<Bar>
开始的其他答案对很多情况都很有用。 如果在某个阶段涉及Foo
的较长方法链中有条件地需要foo.addBar
,那么该方法也适用于那里(尚未测试):
Optional<Foo> foobar = foo.map(foo -> bar.map(bar -> foo.addBar(bar)));
您正在寻找的是Optional.flatMap()
。
以下构造:
Foo result = optionalBar.isPresent() ? optionalFooFromBar( optionalBar.get() ) : foo;
可以改写为:
Foo result = optionalBar.flatMap( bar -> optionalFooFromBar( bar ) ).orElse( foo );
请注意,您保存了整整两个字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.