Java的现有方法将Optional <>映射到对象而不是另一个对象?

时间:2018-12-14 18:14:45

标签: java optional

我熟悉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库中是否已经有此功能?

3 个答案:

答案 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)));