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