我熟悉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;
换句话说,如果存在 other 事物,那么让我对现有事物进行一些处理;否则,就把我现有的东西还给我。
我可以想象自己制作Optionals.doIfOtherPresent(T object, Optional<U> optional, BiFunction<? super T, ? super U, ? extends T> fn)
。我会这样使用它:
Foo foobar = doIfOtherPresent(foo, bar, foo::add);
Java库中是否已经有此功能?
答案 0 :(得分:1)
使用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
,则该“存在”。
.orElse(foo)
如果不存在Optional<Foo>
,则还原为原始bar
(否则返回foo.map(f -> f.add(b))
)。
答案 1 :(得分:0)
以您提供的示例为例,似乎如果要使用foo.add
则要应用操作bar
,否则返回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);
答案 2 :(得分:0)
我认为从Optional<Bar>
开始的其他答案在许多情况下都很有用。如果您需要在某个阶段涉及foo.addBar
的更长方法链中有条件地使用Foo
,则该方法也可以在其中适用(尚未测试):
Optional<Foo> foobar = foo.map(foo -> bar.map(bar -> foo.addBar(bar)));