【发布时间】:2021-03-10 05:10:26
【问题描述】:
我想编写一个通用的 DTO 更新程序,它会更新它的一些属性。我的对象如下所示:
class Person {
String firsName;
String lastName;
Integer age;
setter/getter
}
我有一个枚举,它定义了哪些字段可以被覆盖:
enum OverriddenType {
FIRST_NAME,
LAST_NAME,
AGE
}
而不是像这样执行“硬编码”设置器...
public void override(Person person, Map<OverriddenType,Object> newValuesForProperties) {
newValuesForProperties.forEach((type,value)) -> {
if(type == OverriddenType.FIRST_NAME) {
person.setFirstName((String)value);
} else if(type == OverriddenType.LAST_NAME) {
person.setLastName((String)value);
} else if(type == OverriddenType.AGE) {
person.setAge((Integer)value);
}
});
}
... 我想使用一些 Java 8 函数/消费者特性来定义每个枚举中的设置器。我尝试过这样的事情:
enum OverriddenType {
FIRST_NAME(p -> p.setFirstName(???????)), //don't know what to set here since the value is not here
LAST_NAME(p -> p.setLastName(???????)),
AGE(p -> p.setAge(???????));
Consumer<Person> consumer;
OverriddenType(Consumer<Person> consumer) {
this.consumer = consumer;
}
public Consumer<Person> getConsumer();
}
但正如您所见,我无法在此处传递动态值。也不知道逻辑会是什么样子,但我会想象这样的事情:
public void override(Person person, Map<OverriddenType,Object> newValuesForProperties) {
newValuesForProperties.forEach((type,value)) ->
type.getConsumer().accept(person, value) // this doesn't exist, but I can imagine some additional parameter passing
);
}
你能为我提供一个解决方案吗?它可以工作吗?我担心传入的值是动态的,因此它不适用于枚举..
【问题讨论】:
-
也许检查
BiConsumer
标签: java java-8 functional-programming java-stream consumer