簡體   English   中英

枚舉聲明調用方法

[英]enum declare method for call

我已經改寫了我的帖子以更好地解釋。
我想比較對象,但不使用反射或注釋來聲明字段映射,而是使用枚舉進行映射和函數式編程,我的意思是

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

你不能用枚舉來做到這一點,因為你需要 generics。 不過,您可以使用 class 來實現它。

根據問題中的代碼片段,我假設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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM