首页 > 解决方案 > 如何在 Java 8 中实现 Elvis 运算符?

问题描述

我有经典的“猫王操作员”案例,我正在调用每个可能返回 null 的方法并将它们链接在一起:

thing?:nullableMethod1(a)?:nullableMethod2(b)?:nullableMethod3()

在 Java 8 中,我发现的最忠实的实现是这样的:

return Optional.ofNullable(thing)
    .flatMap(x -> Optional.ofNullable(x.nullableMethod1(a)))
    .flatMap(y -> Optional.ofNullable(y.nullableMethod2(b)))
    .flatMap(z -> Optional.ofNullable(z.nullableMethod3()))

我希望 JavaOptional有类似于 elvis 运算符的东西:

public<U> Optional<U> elvisOperator(Function<? super T, ? extends U> mapper) {
    return flatMap(t -> Optional.ofNullable(mapper.apply(t));
}

这样我就不必包装每个返回值:

return Optional.ofNullable(thing)
    .elvisOperator(x -> x.nullableMethod1(a))
    .elvisOperator(y -> y.nullableMethod2(b))
    .elvisOperator(Z::nullableMethod3); // also nice

在 Java 8 中实现 Elvis 运算符模式是否有更有效和惯用的方法?

标签: javajava-8functional-programmingoptional

解决方案


也许我忽略了一些东西,但是有没有你不能使用的原因Optional#map

以下示例不打印任何内容,就像Optional短路一样,如果 内部的值Optional不存在(它是nullOptional为空),则将其视为空。

Optional.ofNullable("test")
        .map(s -> null)
        .ifPresent(System.out::println);

因此,我认为您可以执行以下操作:

return Optional.ofNullable(thing)
               .map(x -> x.nullableMethod1(a))
               .map(y -> y.nullableMethod2(b))
               .map(Z::nullableMethod3);

如果它存在,这将映射你的thing,否则返回一个空的Optional


推荐阅读