级联方法,每个方法都返回一个Java8 Optional<>

时间:2015-09-18 10:46:09

标签: java java-8 optional

我有几种方法,每种方法都返回一个可选的字符串。我如何组合,以便java调用每个方法,直到找到结果?

我想结束这样的事情,但没有orElseFlatMap()方法:

import java.util.Optional;

public class OptionalCascade {

    public static void main(String[] args) {
        Optional<String> result = 

                // try to get a result with method A
                methodA()

                // if method A did not return anything, then try method B
                .orElseFlatMap(methodB());
    }


    static Optional<String> methodA() {
        return Optional.empty();
    }

    static Optional<String> methodB() {
        return Optional.empty();
    }
}

2 个答案:

答案 0 :(得分:4)

假设您想使用标准方法并使用单表达式解决方案,我只能提出这个:

Optional<String> result = Optional.ofNullable(methodA().orElseGet(
        () -> methodB().orElse(null)));

难看。或者,您可以编写自己的静态方法:

public static <T> Optional<T> orElseFlatMap(Optional<T> optional,
        Supplier<Optional<T>> other) {
    return optional.isPresent() ? optional : other.get();
}

Optional<String> result = orElseFlatMap(methodA(), () -> methodB());

答案 1 :(得分:0)

您可以执行Chain-of-responsibility pattern之类的操作,基本上您只需调用第一种方法即可。然后在你的第一个方法内,如果你可以返回结果然后返回它。如果它是空的,那么请调用你的后继方法。