【问题标题】:enum declare method for call枚举声明调用方法
【发布时间】:2020-08-30 18:12:36
【问题描述】:

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

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";
  }

【问题讨论】:

  • 你能说明你想如何使用MyEnum吗?
  • 你可以添加一个构造函数到你的枚举中,接受一些供应商作为参数,如果这是你想要的。
  • 你没有问问题。
  • 问题是可以用更通用的解决方案替换代码,即使用枚举来存储字段映射
  • PersonPersonEntity 之间有什么区别/关系?

标签: java java-8 functional-programming


【解决方案1】:

你不能用枚举来做到这一点,因为你需要泛型。 你可以通过一个类来实现它。

根据问题中的代码 sn-p,我假设 Person 是一个接口,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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多