Java 8 Optional扩展:在映射过程中携带参数
Java 8 Optional 扩展:保留前置对象引用的实用场景
在不少开发场景中,让Java 8的Optional保留之前映射对象的引用会非常实用。
常规的链式映射场景可通过Optional的流畅API实现,还能省去繁琐的空值检查:
// 常规写法(需手动处理空值检查,示例中省略) A a = new A(); B b = calculateB(a); C c = calculateC(b); D d = calculateD(c); E e = calculateE(d); // 使用Optional链式调用简化 E e = Optional.ofNullable(a) .map(this::calculateB) .map(this::calculateC) .map(this::calculateD) .map(this::calculateE) .orElse(null);
但当后续方法需要同时用到多个前置对象时,原生Optional API无法满足需求,比如以下场景:
A a = new A(); B b = calculateB(a); C c = calculateC(a, b); // 同时依赖a和b D d = calculateD(a, c); // 同时依赖a和c E e = calculateE(a, d); // 同时依赖a和d
针对这种情况,可以自定义扩展的PowerOptional类,通过mapAndKeep方法携带前置参数,实现如下链式调用:
PowerOptional.ofNullable(a) .mapAndKeep(this::calculateB) // 保留输入对象a,同时传递新生成的b到下一环 .map((a, b) -> calculateC(a, b)) .map((a, c) -> calculateD(a, c)) .map((a, d) -> calculateE(a, d)) .orElse(null);
这种扩展能提升复杂方法调用的可读性,现提出两个问题:
- 是否有现成的Java类库实现了类似功能?
- 关于这类扩展的命名、API设计有哪些合理建议?
内容的提问来源于stack exchange,提问作者juanmf
相关产品推荐
相关产品推荐

