gpt4 book ai didi

lambda - 如何从 Optional 列表中获取第一个非空 Optional

转载 作者:行者123 更新时间:2023-12-04 15:42:57 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Optional orElse Optional in Java

(6 个回答)


6年前关闭。




我正在将一些代码移至 java8,尝试(有时强制自己)使用流和 lambda,但我对它们还不满意。

我在一个类中有一些方法来验证业务对象。每个方法看起来像

Optional<Fail> validate1(BusinessObject bo)

其中 Fail 是一个以某种方式描述错误的枚举,如果没有错误,该方法返回 Optional.empty()。我不需要收集所有错误,而是返回第一个错误,而不执行以下验证。

我正在做的是
//first convert methods to suppliers
Supplier<Optional<Fail>> validate1= () -> validate1(bo);
Supplier<Optional<Fail>> validate2= () -> validate2(bo);
Supplier<Optional<Fail>> validate3= () -> validate3(bo);
//then some stream magic
return Stream.of(validate1, validate2, validate3)
.map(Supplier::get)
.filter(f -> f.isPresent())
.findFirst()
.orElse(Optional.empty()); //without the orElse, no error would return
// Optional(Optional.empty())
// instead of Optional.empty()

它工作,它完成工作,它不执行不必要的方法,它清晰易读(如果将 Optional.orElse 命名为 getOrElse 会更清晰,但这是我无法实现的)。我想知道的是,这是否是一种合理的方式来做我想做的事情,如果这段代码被认为是“良好的风格”或“惯用的 java8”,或者我是否误用了 Stream 或 Optional,或者遗漏了一些明显的东西。

返回第一个非空的 Optional 或一个空的 Optional(如果它们都是空的)的想法看起来很一般,足以认为有一种官方的方法可以做到这一点,我脑后的某个东西正在大喊“Monads!”,但我的无知Haskell 的几乎是完美的,所以我不知道。

最佳答案

Optional很像 Stream其中包含 0 或 1 个元素。但它没有实现 Stream ,也没有 stream()方法(就像集合一样)。

但是,转换 Optional<T> 并不难。到 Stream<T> ,这个函数做到了:

public static <T> Function<Optional<? extends T>, Stream<T>> asStream() {
return op -> op.map(Stream::of).orElseGet(Stream::empty);
}

使用该方法,您可以简单地使用 flatMap :
Stream.of(validate1, validate2, validate3)
.map(Supplier::get)
.flatMap(asStream())
.findFirst();

关于lambda - 如何从 Optional<T> 列表中获取第一个非空 Optional<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30880972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com