java - 使用 Java 8 为类中任意数量的字段构建比较器逻辑
问题描述
我正在尝试使用Comparator.comparing()
Java 8 中引入的自定义比较逻辑。
要求是:如果在 Person 类中引入了新字段,代码应该可以工作。它应该将新领域纳入比较逻辑。
这意味着比较逻辑应该是这样的:id --> name --> new field1 --> new field2
请参阅下面的伪代码:
package test;
import java.lang.reflect.Field;
import java.util.Comparator;
public class Test6 {
public static void main (String args []) {
Field[] declaredFields = Person.class.getDeclaredFields();
Comparator<Person> comparator = Comparator.comparing((Person x)-> x.getId());
for (int i=1; i<declaredFields.length ; i++) {
comparator = comparator.thenComparing(field[i]); // what code should I place over here, to make it work for field obtained above.
}
List<Person> persons = new ArrayList<>();
persons.stream().sorted(comparator).collect(Collectors.toList());
}
}
class Person{
int id ;
String name;
// if we add new field , then this field should also be included in comparison logic
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
解决方案
在 Apache Commons BeanUtils 中有一个BeanComparator
基于反射的有用比较器。结合 ReverseComparator 可以编写一个动态比较器。
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
简单的例子:
public static <T> Comparator<T> beanComparator(String fieldName, boolean asc) {
Comparator<T> propertyComparator;
if (asc) {
propertyComparator = new BeanComparator<>(fieldName);
} else {
propertyComparator = new ReverseComparator(new BeanComparator<>(fieldName));
}
return propertyComparator;
}
推荐阅读
- python - 如何通过 BeautifulSup 的标签选择来下载视频
- c# - 如何使用 Filesystemwatcher 通过默认应用程序打开检测到的文件
- svg - feColorMatrix 的第五列到底代表什么
- r - 添加以每个元素的名称作为值的新列
- r - 如何使用工具变量在 R 中进行 2 阶段逻辑回归
- java - 导航抽屉中的 setText
- python - 使用 Django south 处理大型项目的迁移是否安全
- python - 对于循环与类对象...我该如何解决?
- logging - Fluentd 过滤异常——kubernetes 集中式日志记录
- python - Python 模块无法在 Linux Mint 上的文本编辑器中加载(但在命令行中工作)