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

6
我有几个方法,每个方法都返回一个可选的字符串。如何将它们组合起来,以便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();
    }
}

你想在得到结果后立即短路吗?如果是这样,你不能只将方法调用放在构造函数中。你需要用lambda表达式包装调用(例如使用 orElseGet(() -> methodB())。 - Marko Topolnik
我会继续使用老式的if-else和null值 :) - ZhongYu
2个回答

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());

好的解决方法建议 - 但仍然不是我正在寻找的“解决方案”... :( 无论如何,感谢您的回答。 - slartidan
1
@slartidan,可能你不需要将结果存储为可选项。只需使用String result = methodA().orElseGet(() -> methodB().orElse(whatEver));即可。 - Tagir Valeev
我认为 OP 想要以这种方式级联超过两个方法。这种方法会导致嵌套而不是级联语法。 - Marko Topolnik

0
你可以使用类似于责任链模式的方法,基本上只需调用第一个方法。然后在第一个方法内,如果能够返回结果,则返回它。如果为空,则调用接下来的方法。

谢谢您的回答。但是,我正在寻找一种Java8的函数式语法解决方案来组合我的可选项。我想避免if/else等语句。 - slartidan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接