我有一个经典的“Elvis operator”案例,我调用了每个都可能返回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()))
我希望Java的Optional
具有类似于elvis操作符的功能:
public<U> Optional<U> elvisOperator(Function<? super T, ? extends U> mapper) {
return flatMap(t -> Optional.ofNullable(mapper.apply(t));
}
这样我就不必 Package 每个返回值:
return Optional.ofNullable(thing)
.elvisOperator(x -> x.nullableMethod1(a))
.elvisOperator(y -> y.nullableMethod2(b))
.elvisOperator(Z::nullableMethod3); // also nice
在Java8中,有没有更有效、更惯用的方法来实现Elvis运算符模式?
5条答案
按热度按时间9ceoxa921#
也许我忽略了一些东西,但是有什么原因不能使用
Optional#map
吗?下面的示例不打印任何内容,因为
Optional
是 short-circuiting,即如果Optional
中的值不存在(它是null
或Optional
为空),它将被视为空。因此,我认为您可以执行以下操作:
这将Map您的
thing
(如果存在),否则返回空的Optional
。xpcnnkqh2#
在Java 8中,Elvis运算符可以通过将
.map(...)
调用链接到Optional.ofNullable(...)
上并使用.orElse(...)
对其进行封顶来模拟:一个完整的例子:
ghg1uchk3#
我写了一个compiler plugin,它在编译时操纵AST生成
Optional.ofNullable
链它几乎没有限制,但确实减少了重复代码
PS:我是作者的插件
oyjwcjzk4#
模拟elvis操作员的另一个选项是使用以下帮助器函数:
您可以像这样使用它:
q1qsirdb5#
为了完成Jacob的想法,我创建了这个类:
那你就做