java - 在java中使用Builder更新对象的特定字段
问题描述
我有两节课,如下所述。我想创建两个class A
.
我想从现有实例 obj1 创建实例 obj2,并将 a3 属性的更新值为"Java"
.
我曾尝试使用Builder在下一行,但它不起作用。
A obj2 = obj1.builder().a3("Java").build();
我可以通过调用构造函数来做到这一点,但我只想做Builder
模式。
@Builder
@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()});
A obj3 = obj1.toBuilder().a3("Java").build();
}
}
} }
如更新代码中所述,我有 A 列表,我想a1 and a2
使用 builder 更新列表中所有元素的属性。但是 builder 不能很好地使用 lambda。如果我将使用带有以下代码的 setter,它工作正常。
list.forEach(a -> {
a.setA1("newA1");
a.setA2("newA2");
});
a1 and a2
如果出现以下情况,Builder
我无法获得更新的值Lambda
解决方案
obj1.builder()
是一种允许但令人困惑的说法A.builder()
。不建议在实例上调用静态方法。A
无论哪种方式,都会创建一个全新的。
@Builder(toBuilder = true)
可能是你要找的
如果为 true,则生成一个实例方法来获取一个使用此实例的值初始化的构建器。仅当
@Builder
用于构造函数、类型本身或返回声明类型实例的静态方法时才合法。boolean toBuilder() default false;
推荐阅读
- javascript - Angular Firestore 根据条件更改此查询
- objective-c - 如何以编程方式在屏幕上应用滤色器?
- angular - 如何为订阅回调编写单元 - Jasmine / Angular
- c++ - 错误:将“unsigned long”类型的引用绑定到“const unsigned long”类型的值删除“const”限定符
- c++ - 编写一个 C++ 程序以乱序打印字符串的字母
- powerbi - 基于列值格式化矩阵的条件度量的 DAX 语法?
- python - 在 setter 和 @property 装饰器中遇到一些麻烦和混乱,并非所有在 `__init__` 中定义的属性都已更新
- flutter - Flutter Provider 在 initState() 中返回 null
- azure - 创建 Azure Function App 时未找到 ARM 模板存储帐户
- python - 在 Django 中保存原始 SQL 查询的最佳方法