从可选值的供应商序列中提取第一个定义值(如果有)
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
给定一个 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