假设你有一些具有多个字段的对象,可以通过以下方式进行比较:
public class Person { private String firstName; private String lastName; private String age; /* Constructors */ /* Methods */ }
因此,在此示例中,当你询问是否:
a.compareTo(b) > 0
你可能会问a的姓氏是否早于b的姓氏,或者a是否早于b,等等。
在这些对象之间进行多重比较而不增加不必要的混乱或开销的最干净的方法是什么?
java.lang.Comparable
compareByFirstName()
compareByAge()
你可以实现Comparator比较两个Person对象的,并且可以根据需要检查任意多个字段。你可以在比较器中放入一个变量,以告知要与哪个字段进行比较,尽管编写多个比较器可能会更简单
Comparator
Person
使用Java 8:
Comparator.comparing((Person p)->p.firstName) .thenComparing(p->p.lastName) .thenComparingInt(p->p.age);
如果你有访问器方法:
Comparator.comparing(Person::getFirstName) .thenComparing(Person::getLastName) .thenComparingInt(Person::getAge);
如果一个类实现Comparable,则可以在compareTo方法中使用这样的比较器:
@Override public int compareTo(Person o){ return Comparator.comparing(Person::getFirstName) .thenComparing(Person::getLastName) .thenComparingInt(Person::getAge) .compare(this, o); }