当前位置: 首页 > 知识库问答 >
问题:

如何在函数样式中多次编写“如果optional为空,调用下一个返回optional的方法,如果not返回此非空optional”?[副本]

裴焱
2023-03-14

假设我有这个方法

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和OrElseGetreturn

编辑

我想逐一检查验证,因为它们是外部的,而且很重。这样,我只会调用必要的


共有3个答案

曾修真
2023-03-14

如果要验证的项目列表较长/动态,则可能需要使用流:

return Stream.<Supplier<String>>of(s::getItem, req::getPayment, ...)
         .map(s -> this.validateItem(s.get()))
         .filter(Predicate.not(Optional::isEmpty)) //or filter(o -> !o.isEmpty())
         .findFirst();
祝俊
2023-03-14

只需使用

如果存在值,则返回描述该值的可选,否则返回由供应函数生成的可选

return validatePayment(s.getItem()).or(() -> validatePayment(s.getPayment()));

孔阳平
2023-03-14
匿名用户

这种情况是可选的。为添加了或。它是在Java9中添加的,所以如果您仍然使用Java8,那么就不能使用它。

return validateItem(s.getItem())
    .or(() -> validatePayment(req.getPayment()))
    .or(() -> /*another one*/);

如果您仍停留在Java8上,那么可以编写一个助手方法

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函数式编程(六):Optional,包括了Java函数式编程(六):Optional的使用技巧和注意事项,需要的朋友参考一下 选取单个元素 直觉来说选取单个元素肯定会比选取多个要简单得多,不过这里也存在一些问题。我们先看下一般的做法的问题是什么,然后再看下如何用lambda表达式来解决它。 我们先新建一个方法来查找一个以特定字母开头的元素,然后打印出来。 这个方法简直跟刚过去

  • 但是如果serviceworkList列表为空,则变量“validate”为false。我知道allMatch的规范,如果list为空,则返回为true。 有什么建议,我可以如何重建流,如果列表列表为空,我会得到假?

  • 当我在输入元素中输入第一个字符时,我得到“空字符串”。 在我看来,我在输入元素中输入一个字符,触发“onChange”事件,运行函数getTitle,设置“title”变量,该变量连接到useState钩子,然后控制结果。按照这个推理,我希望输入第一个字符。相反,我得到的是“空字符串”。从第二个字符开始,控制台打印字符。 对于“onInput”,函数也会发生同样的情况。 如何解决这个问题,为什么会

  • 问题内容: 在Python中,我想编写一个返回另一个函数的函数。返回的函数应该可以通过参数调用,并返回高度和半径为圆柱的体积。 我知道如何从Python中的函数返回 值 ,但是如何返回 另一个函数 ? 问题答案: 使用Python尝试一下: 这样使用它,例如与和: 注意,返回一个函数很简单,只需在函数内部定义一个新函数,然后在最后返回它- 小心地为每个函数传递适当的参数。仅供参考,从另一个函数返回

  • 问题内容: 我想使用java8替换以下代码: 以下伪代码由于没有方法而无法使用,但无论如何它说明了我的目的: 问题答案: 对于Java 9或更高版本,最可能需要的是: 使用vavr之类的方法进行固化可能会得到更整齐的代码,但是我还没有尝试过。