3

给定一个序列Supplier<Option<T>>——例如,一个方法引用列表——获得第一个定义结果的惯用方法是什么,如果有的话?理想情况下,在第一个成功的结果之后不再调用任何供应商。

我现在拥有的是:

Stream<Supplier<Option<Foo>>> suppliers = Stream.of(
  bar::fooOption,
  baz::fooOption,
  qux::fooOption
);

Option<Foo> firstDefined = suppliers.map(Supplier::get)
  .find(Option::isDefined)
  .flatMap(Function.identity());

但似乎应该有一种方法可以使平面图更平坦。

4

2 回答 2

2

我只能看到与您的步骤数相同的替代解决方案。

Option<Foo> firstDefined = suppliers.map(Supplier::get)
        .find(Option::isDefined)
        .map(Option::get);

如果您可以使用 simplemap而不是 a flatMap,请改用它,因为它通常会更快,尤其是在多值 monadic 容器上。尽管对于 0/1 值的 monad,例如Option,可能没有太大区别,也许相反,在这种情况下它可能会慢一点,因为它会创建一个额外的Option.

于 2017-07-24T21:19:35.563 回答
2

你想要flatMap:)

 suppliers.flatMap(_.get).headOption
于 2017-07-24T21:52:16.707 回答