- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个这样的模型:
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/
概述 CentOS Stream 成立于 2019 年,是“RHEL 下一步的滚动预览”。Red Hat 首席技术官 Chris Wright 和 CentOS 社区经理 Rich Bowen 各
我有一个使用 Mesosphere DC/OS 编排选项进行配置的 Azure 容器服务 (ACS) 集群。我可以在 Marathon UI 中创建一个应用程序。 但是,当我通过 Marathon U
我是一名优秀的程序员,十分优秀!