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

时间:2017-07-24 20:29:27

标签: java scala functional-programming vavr

给定一系列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 更平坦的方式。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

你想要flatMap:)

 suppliers.flatMap(_.get).headOption