gpt4 book ai didi

java - 通过反射根据字段名称对 List 进行排序
转载 作者:行者123 更新时间:2023-12-02 02:31:40 25 4
gpt4 key购买 nike

我有一个这样的模型:

public class Contact {

private int id;

private String firstName;

private String lastName;

private String address;

private String city;

private String state;

private String zipCode;

private String mobilePhone;

private String email;

private String dayOfBirth;

private int age;

public String toLine() {
return String.format("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s", id, firstName, lastName, dayOfBirth, address, city, state, zipCode, mobilePhone, email);
}
}

我编写了一个排序函数,通过使用反射按字段名称对 List 进行排序,但 field.get(contact1) 没有方法compareTo。有什么办法可以实现吗?顺便说一句,有什么办法可以让 toLine 函数更短吗?好像太长了。

    public void sortByFieldName(String fieldName, List<Contact> validContacts) throws NoSuchFieldException {

Field field = Contact.class.getDeclaredField(fieldName);
field.setAccessible(true);

validContacts.stream().sorted((contact1, contact2) -> field.get(contact1).compareTo(field.get(contact2)));
}

我不想使用它,因为它似乎不灵活:

if (fieldName.equals("zipCode")) {
validContacts.sort(Comparator.comparing(Contact::getZipCode));
}

我删除了 getter 和 setter,因为它太长了

最佳答案

你根本不需要任何反射(reflection)。您可以使用 Comparator#comparing 来实现:

List<Contact> sortedContacts = validContacts.stream()
.sorted(Comparator.comparing(Contact::getZipCode))
.collect(Collectors.toList());

当然,这假设您的类具有 getter 方法,但您的问题中没有。如果是这种情况并且字段可访问,您还可以使用 c -> c.zipCode 而不是 Contact::getZipCode。如果情况并非如此,并且类确实看起来像您所显示的那样,则这些字段将毫无用处,因为没有人可以访问它们(除非它是另一个类中的静态类)。

<小时/>

如果您确实需要使用反射来执行此操作 - 我真的认为您不需要 - 那么您可以这样做。但我想说这是更具体的并且不可重复使用。使用如上所示的流 API 会更好:

public static List<Contact> sortByFieldName(List<Contact> list, String fieldName) throws NoSuchFieldException {
Field field = Contact.class.getDeclaredField(fieldName);
if (!String.class.isAssignableFrom(field.getType())) {
throw new IllegalArgumentException("Field is not a string!");
}

field.setAccessible(true);
return list.stream()
.sorted((first, second) -> {
try {
String a = (String) field.get(first);
String b = (String) field.get(second);
return a.compareTo(b);
} catch (IllegalAccessException e) {
throw new RuntimeException("Error", e);
}
})
.collect(Collectors.toList());
}

关于java - 通过反射根据字段名称对 List<Object> 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46997943/

25 4 0