gpt4 book ai didi

java - 枚举声明调用方法

转载 作者:行者123 更新时间:2023-12-01 16:45:12 25 4
gpt4 key购买 nike

我重新表述了我的帖子以更好地解释。
我想比较对象,但不使用反射或注释来声明字段映射,而是使用枚举进行映射和函数式编程,我的意思是

enum MyEnum {
PERSON_LAST_NAME("lastName", Person::getLastName(), PersonEntity::getLstName())
}

现在有了 Person 和 PersonsEntity 的实例,我想迭代 MyEnum 值,在我的对象上调用这些声明的方法。
只是想用更通用的解决方案替换代码

  Person person = getPerson();
Person personEntity = getPersonEntity();
if (Objects.equals(person.getLastName(), personEntity.getLstName()) {
return "lastName";
}
if (Objects.equals(person.getFirstName(), personEntity.getFstName()) {
return "firstName";
}

最佳答案

您不能使用枚举来执行此操作,因为您需要泛型。不过,您可以通过类(class)来实现它。

根据问题中的代码片段,我假设 Person 是一个接口(interface),并且 PersonEntity 实现它

但请允许我否认,除非您非常清楚自己在做什么,否则我会说您使用这种方法会走上一条糟糕的路线,但为了实现目的,这里有一个使用函数的通用解决方案。

class FieldComparator<T, V> {
public static final List< FieldComparator<Person, ?>> PERSON_FIELD_COMPARATORS = List.of(
new FieldComparator<>("firstName", Person::getFirstName),
new FieldComparator<>("lastName", Person::getLastName),
new FieldComparator<>("birthDate", Person::getBirthDate)
);

private final String fieldName;
private final Function<T, V> function;

public FieldComparator(String fieldName, Function<T, V> function) {
this.fieldName = fieldName;
this.function = function;
}

public boolean equals(T t1, T t2) {
return Objects.equals(function.apply(t1), function.apply(t2));
}

public String getFieldName() {
return fieldName;
}
}

使用迭代:

Person person = getPerson();
Person personEntity = getPersonEntity();

for (FieldComparator<Person, ?> fieldComparator : FieldComparator.PERSON_FIELD_COMPARATORS) {
if (fieldComparator.equals(person, personEntity)) {
return fieldComparator.getFieldName();
}
}

return null;

使用流:

Person person = getPerson();
Person personEntity = getPersonEntity();

return FieldComparator.PERSON_FIELD_COMPARATORS.stream()
.filter(fieldComparator -> fieldComparator.equals(person, personEntity))
.map(FieldComparator::getFieldName)
.findFirst()
.orElse(null);

关于java - 枚举声明调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61793480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com