具有Java 8的lambda表达式的生成器

问题描述 投票:0回答:1

我有两个班级,如下所述,我想创建两个实例的 class A.

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

我曾试过下面的行使用 建设者但这是行不通的。

A obj2 = obj1.builder().a3("Java").build();

我可以通过调用构造函数来实现,但我想通过以下方式实现 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();
    }
}

如在更新的代码中所提到的,我有A的列表,我想更新 a1 and a2 列表中的所有元素的属性,使用构建器。但是builder不能和lambda一起工作,如果我使用下面的代码setter,就能正常工作。

list.forEach(a -> {
    a.setA1("newA1");
    a.setA2("newA2");
});

我无法获得更新的 a1 and a2 若是 BuilderLambda

java java-8 builder lombok
1个回答
5
投票

这条语句没有任何作用

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

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

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

0
投票

网友@Michael的回答已经修正了你粘贴中的一堆错误。

之所以说 "不能用"(请下次说得具体一点),是因为你做的是无操作。

的操作。

x.toBuilder().changeSomething().build() 制作一个新的对象. 它不会修改对象。Builder是为不可改变的对象准备的, 你不能修改它们.

所以,对于列表中的每一个元素,你都会从中派生出一个生成器,进行一些修改,并从中创建一个新的对象,然后立即将这个对象扔进垃圾桶。

试试吧。

list.stream().map(a -> a.toBuilder().a1("newA1").build()).collect(Collectors.toList());

或者更简单的方法:

for (int i = 0; i < list.size(); i++) {
    var withNewValue = list.get(i).toBuilder().a1("newA1").build();
    list.set(i, withNewValue);
}

有时候,老办法是最好的办法。

© www.soinside.com 2019 - 2024. All rights reserved.