按多个字段比较对象
在面向对象编程中,通常需要根据对象的各个字段来比较对象。然而,Comparable 接口只允许通过单个字段进行比较。
问题
考虑具有字段firstName、lastName 和age 的Person 类。我们需要一种方法来通过多个字段来比较这些对象,而不需要添加过多的方法或开销。
Java 8 解决方案
Java 8 引入了 lambda 表达式和方法引用,这使得创建自定义比较器很容易:
Comparator<Person> comparator = Comparator.comparing((Person p) -> p.firstName) .thenComparing(p -> p.lastName) .thenComparingInt(p -> p.age);
此比较器首先比较firstName,然后比较lastName,最后比较年龄。
替代语法
如果 Person 类具有其字段的访问器方法,我们可以使用方法引用来简化比较器:
Comparator<Person> comparator = Comparator.comparing(Person::getFirstName) .thenComparing(Person::getLastName) .thenComparingInt(Person::getAge);
使用比较器
一次比较器已创建,我们可以按如下方式使用它:
对 Person 对象的集合进行排序:
List<Person> persons = ...; Collections.sort(persons, comparator);
比较两个对象人对象:
Person p1 = ...; Person p2 = ...; int result = comparator.compare(p1, p2);
实现 Comparable
如果一个类需要直接比较(例如,用于排序数据结构),它可以通过以下方法实现 Comparable 接口:
@Override public int compareTo(Person o) { int result = Comparator.comparing(Person::getFirstName) .thenComparing(Person::getLastName) .thenComparingInt(Person::getAge) .compare(this, o); return result; }
这种方法简化对象比较并减少对多种专用比较方法的需求。
以上是如何根据多个字段比较 Java 对象?的详细内容。更多信息请关注PHP中文网其他相关文章!