Mic*_*lot 11 java functional-programming optional java-8
我有经典的"Elvis运算符"案例,我在这里调用方法,每个方法都可以返回null并将它们链接在一起:
thing?:nullableMethod1(a)?:nullableMethod2(b)?:nullableMethod3()
Run Code Online (Sandbox Code Playgroud)
在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()))
Run Code Online (Sandbox Code Playgroud)
我希望Java Optional
有类似于elvis运算符的东西:
public<U> Optional<U> elvisOperator(Function<? super T, ? extends U> mapper) {
return flatMap(t -> Optional.ofNullable(mapper.apply(t));
}
Run Code Online (Sandbox Code Playgroud)
这样我就不必包装每个返回值:
return Optional.ofNullable(thing)
.elvisOperator(x -> x.nullableMethod1(a))
.elvisOperator(y -> y.nullableMethod2(b))
.elvisOperator(Z::nullableMethod3); // also nice
Run Code Online (Sandbox Code Playgroud)
在Java 8中实现Elvis运算符模式是否有更高效和惯用的方法?
Jac*_* G. 13
也许我忽视了一些事情,但是有一个你不能使用的理由Optional#map
吗?
下面的例子打印任何东西,因为Optional
是短路在这个意义上,如果里面的值Optional
不存在(它null
或者Optional
是空的),它会被视为空.
Optional.ofNullable("test")
.map(s -> null)
.ifPresent(System.out::println);
Run Code Online (Sandbox Code Playgroud)
因此,我认为您可以执行以下操作:
return Optional.ofNullable(thing)
.map(x -> x.nullableMethod1(a))
.map(y -> y.nullableMethod2(b))
.map(Z::nullableMethod3);
Run Code Online (Sandbox Code Playgroud)
这将映射您thing
是否存在,否则返回空Optional
.
在 Java 8 中,Elvis 操作符可以通过链接.map(...)
对 an 的调用来模拟,Optional.ofNullable(...)
并用 来限制它.orElse(...)
:
Optional.ofNullable(dataObject)
.map(DataObject::getNestedDataObject)
.map(NestedDataObject::getEvenMoreNestedDataObject)
...
.orElse(null);
Run Code Online (Sandbox Code Playgroud)
一个完整的例子:
Optional.ofNullable(dataObject)
.map(DataObject::getNestedDataObject)
.map(NestedDataObject::getEvenMoreNestedDataObject)
...
.orElse(null);
Run Code Online (Sandbox Code Playgroud)