gpt4 book ai didi

java - 如何以函数式风格多次写入 "if optional is empty, call next method returning optional, if not return this non-empty optional"?

转载 作者:行者123 更新时间:2023-12-04 12:13:20 29 4
gpt4 key购买 nike

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





Chaining Optionals in Java 8

(9 个回答)



Optional orElse Optional in Java

(6 个回答)



Functional style of Java 8's Optional.ifPresent and if-not-Present?

(12 个回答)


6 个月前关闭。




假设我有这个方法

public Optional<String> validateAndReturnErrorMessage(SomeEcommerceSale s) {
Optional<String> errorWithItem = validateItem(s.getItem());
if (errorWithItem.isPresent()) return errorWithItem;

Optional<String> errorWithPayment = validatePayment(s.getPayment());
if (errorWithPayment.isPresent()) return errorWithPayment;

// assume I have several other cases like the 2 above

return Optional.empty(); // meaning there were no errors
我的问题是,因为 OrElse and OrElseGet 返回 <T>而不是 Optional<T> ,是否有一种本地方法可以将其重写为更实用的方式,而无需几个松散耦合的 return 语句?
编辑
我想一一检查验证,因为它们是外部且沉重的。这样,我只会调用必要的

最佳答案

这种情况是什么 Optional.or 被添加为。它是在 Java 9 中添加的,因此如果您仍在使用 Java 8,则无法使用它。

return validateItem(s.getItem())
.or(() -> validatePayment(req.getPayment()))
.or(() -> /*another one*/);
如果你被 Java 8 卡住了,你可以写一个辅助方法
public static <T> Optional<T> firstNonEmpty(List<Supplier<Optional<T>>> supplierList) {
for (Supplier<Optional<T>> supplier : supplierList) {
Optional<T> value = supplier.get();
if (value.isPresent()) return value;
}
return Optional.empty();
}
它像这样使用它:
return firstNonEmpty(
Arrays.asList(
() -> validateItem(s.getItem()),
() -> validatePayment(req.getPayment()),
() -> /*another one*/
)
);

关于java - 如何以函数式风格多次写入 "if optional is empty, call next method returning optional, if not return this non-empty optional"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67400460/

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