java - 如何在 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 运算符模式是否有更有效和惯用的方法?
解决方案
也许我忽略了一些东西,但是有没有你不能使用的原因Optional#map
?
以下示例不打印任何内容,就像Optional
短路一样,如果 内部的值Optional
不存在(它是null
或Optional
为空),则将其视为空。
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
。
推荐阅读
- asp.net-core - 向标头添加授权并访问 [Authorize] 控制器
- r - 错误 503 从同一 Web 抓取多个 url 而没有错误 503
- java - 从 Firebase 检索数据时导致应用停止的错误是什么?
- grails - Grails 命令对象未绑定到“def”类型
- r - 计算最近要素的方位角
- java - 在 GSON 中设置默认值
- c# - 如何绑定字典
在实体框架的 asp.net 核心中? - javascript - 如何减小 HTTP 响应的大小?
- node.js - 在节点 js 中使用类验证器验证数组对象
- kubernetes - 如何使用大使作为 Rails 和 Angular 应用程序的 API 网关