Comparator接口包含许多方便的静态方法来创建比较器。这些方法可用于lambda表达式或方法引用。静态比较方法采用“键提取器”函数,将类型T映射到可比较的类型(例如String)。将此函数应用到需要比较的对象上,然后对返回的key完成比较。例如,给定一个Person对象数组,您可以按名称对这些对象进行排序,如下所示:Arrays.sort(people,Comparator.comparing(Person::getName));这当然比手动实现Compamtor容易得多。此外,代码更简洁,因为显然我们都想按人名进行比较。可以使用thenComparing方法链接比较器。例如:Arrays.sort(people,Comparator.comparing(Person::getlastName).thenComparing(Person::getFirstName));如果两个人的姓氏相同,则使用第二个比较器。这些方法有很多变体。可以为通过comparing和thenComparing方法提取的键指定一个比较器。例如,按人名长度排序可以按如下方式完成:Arrays.sort(people,Comparator.comparing(Person::getName,(s,t)->Integer.compare(s.length(),t.length()));此外,comparing和thenComparing方法具有避免装箱int、long或double值的变体。有一种更简单的方法可以完成前面的操作:Arrays.sort(people,Comparator.comparingInt(p->p.getName().length()));如果key函数可以返回null,则可以使用nullsFirst和nullsLast适配器,这些静态方法修改现有的比较器,使其不抛出异常,但值为标记为小于或大于正常值。例如,假设当一个人没有中间名时getMiddleName返回null,您可以使用Comparator.comparing(Person::getMiddleName(),Comparator.nullsFirst(...)。nullsFirst方法需要一个比较器,在本例中它比较两个字符一个字符串的比较器,naturalOrder方法可以为任何实现了Comparable的类创建一个比较器,这里Comparator.naturalOrder()正是我们需要的,下面是一个完整的调用,可以通过中间名which可能是nullSorting。这里用了一个staticimportjava.util.Comparator.*来理解表达式。注意可以推导出naturalOrder的类型Arrays.sort(people,comparing(Person::getMiddleName,nullsFirst(naturalOrder())));静态reverseOrder方法会提供自然顺序的倒序,要让比较器倒序比较,可以使用reversed实例方法,例如naturalOrder().reversed()等价于reverseOrder().
