繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM