You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:22:07