使用Java 8 Lambda实现Builder模式的疑问(替代Lombok)
Java 8实现类似Lombok的Builder模式(基于Consumer)
你遇到的问题核心是两点:一是FooBuilder缺少支持链式调用的setter方法,二是add方法里没有实例化Builder并让Consumer去修改它,导致无法提取值。下面是完整的实现方案:
1. 完善FooBuilder类
给FooBuilder添加链式调用的setter方法,同时提供获取属性的方法,让后续能读取设置后的值:
import java.util.Optional; import java.util.function.Consumer; class FooBuilder { private Optional<Integer> a = Optional.empty(); private Optional<Integer> b = Optional.empty(); // 链式setter:设置a并返回当前实例,支持连续调用 public FooBuilder a(Integer value) { this.a = Optional.ofNullable(value); return this; } // 链式setter:设置b并返回当前实例 public FooBuilder b(Integer value) { this.b = Optional.ofNullable(value); return this; } // 获取a的Optional值 public Optional<Integer> getA() { return a; } // 获取b的Optional值 public Optional<Integer> getB() { return b; } }
2. 实现Bar类的add方法
在add方法中先创建FooBuilder实例,让Consumer去修改这个实例,之后就能从实例中提取设置好的属性值:
class Bar { public void doSomething() { var result = add(p -> p.a(5).b(3)); System.out.println(result); // 输出8 } public int add(Consumer<FooBuilder> func) { // 创建Builder实例 FooBuilder builder = new FooBuilder(); // 让Consumer修改这个实例 func.accept(builder); // 提取值,根据业务处理Optional空值:这里用0作为默认值,也可以用orElseThrow抛异常 int aValue = builder.getA().orElse(0); int bValue = builder.getB().orElse(0); return aValue + bValue; } }
关键说明
- 链式setter是核心:每个setter方法返回
this,才能实现p.a(5).b(3)这种连续调用的写法,和Lombok Builder的用法对齐。 - Consumer的作用是修改预先创建的Builder实例:不是让Consumer凭空构建对象,而是让它操作已有的实例,这样后续就能从实例中读取属性。
- Optional空值处理:根据业务场景选择
orElse(设默认值)、orElseThrow(抛异常)或ifPresent(判断后处理)。
内容的提问来源于stack exchange,提问作者hello92304238478203984
相关产品推荐
相关产品推荐

