从可选值的供应商序列中提取第一个定义值(如果有)

Extracting first defined value(if any) from sequence of suppliers of optional values

给定一个 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());

但似乎应该有一种方法可以 flatmap that 更讨人喜欢。

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

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

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

你想要 flatMap :)

 suppliers.flatMap(_.get).headOption