Java使用Lambda表达式对集合进行排序

示例

排序清单

在Java 8之前,对java.util.Comparator列表1进行排序时,必须使用匿名(或命名)类实现接口:

Java SE 1.2
List<Person> people = ...
Collections.sort(
    people,
    new Comparator<Person>() {
        public int compare(Person p1, Person p2){
            return p1.getFirstName().compareTo(p2.getFirstName());
        }
    }
);

从Java 8开始,匿名类可以用lambda表达式替换。请注意,这些参数的类型p1,并p2可以被排除在外,因为编译器会自动推断出它们:

Collections.sort(
    people, 
    (p1, p2) -> p1.getFirstName().compareTo(p2.getFirstName())
);

通过使用Comparator.comparing和方法引用使用::  (双冒号)符号可以简化示例。

Collections.sort(
    people,
    Comparator.comparing(Person::getFirstName)
);

静态导入使我们可以更简洁地表达这一点,但是是否可以提高整体可读性尚待商::

import static java.util.Collections.sort;
import static java.util.Comparator.comparing;
//...
sort(people, comparing(Person::getFirstName));

以这种方式构建的比较器也可以链接在一起。例如,在按姓氏对人进行比较之后,如果有姓氏相同的人,则thenComparing还可以按姓氏进行比较的方法:

sort(people, comparing(Person::getFirstName).thenComparing(Person::getLastName));


1-请注意Collections.sort(...)仅适用于的子类型List。在Set和CollectionAPI不意味着这些单元的任意顺序。

排序映射

您可以HashMap按类似的方式按值对a的条目进行排序。(请注意,LinkedHashMap必须使用a作为目标。普通键中的键HashMap是无序的。)

Map<String, Integer> map = new HashMap();  // ...或任何其他Map类
// 填充映射
map = map.entrySet()
    .stream()
    .sorted(Map.Entry.<String, Integer>comparingByValue())
    .collect(Collectors.toMap(k -> k.getKey(), v -> v.getValue(),
                              (k, v) -> k, LinkedHashMap::new));