带有 Java 8 lambda 表达式的构建器

Sag*_*wal 1 java builder lombok java-8

如下所述,我有两节课。我想创建两个class A.

我想从现有实例 obj1 创建实例 obj2,并将 a3 属性的更新值为"Java".

我曾尝试使用Builder在下面的行,但它不起作用。

A obj2 = obj1.builder().a3("Java").build();
Run Code Online (Sandbox Code Playgroud)

我可以通过调用构造函数来做到这一点,但我只想做Builder模式。

@Builder(toBuilder = true)
@Data
class A {
    String a1;
    String a2;
    String a3;
    B b;

    A(String b1, String b2, String b3, B b) {
        this.a1 = b1;
        this.a2 = b2;
        this.a3 = b3;
        this.b = b;
    }
}

@Builder
@Data
class B {
    String b1;
    String b2;
    String b3;

    B(String b1, String b2, String b3) {
        this.b1 = b1;
        this.b2 = b2;
        this.b3 = b3;
    }

}

class Main {
    public static void main(String[] args) {

        B b = new B("a", "b", "b");
        A obj1 = new A("a1", "b1", "b1", b);
        A obj2 = new A("x1", "y1", "z1", b);
        List<A> list= new ArrayList<>();
        list.add(obj1);
        list.add(obj2);
        list.forEach(a -> {
            a.toBuilder().a1("newA1").a2("newA2").build();
            repository.save(a);
        });

        A obj3 = obj1.toBuilder().a3("Java").build();
    }
}
Run Code Online (Sandbox Code Playgroud)

如更新代码中所述,我有 A 列表,我想a1 and a2使用 builder更新列表中所有元素的属性。但是 builder 不能与 lambda 一起正常工作。如果我将使用带有以下代码的 setter,它就可以正常工作。

list.forEach(a -> {
    a.setA1("newA1");
    a.setA2("newA2");
});
Run Code Online (Sandbox Code Playgroud)

我没能得到更新值a1 and a2的情况下BuilderLambda

Mic*_*ael 5

这个语句没有任何作用

list.forEach(a -> {
    a.toBuilder().a1("newA1").a2("newA2").build();  //<<<
    repository.save(a);
});
Run Code Online (Sandbox Code Playgroud)

您正在从旧对象创建一个新对象,然后将其丢弃。它不会对现有对象进行更改。考虑

list.stream()
    .map(a -> a.toBuilder().a1("newA1").a2("newA2").build())
    .forEach(repository::save);
Run Code Online (Sandbox Code Playgroud)