使用lambda表达式给集合排序

list排序


在java8之前,给list排序需要使用实现java.util.Comparator接口的匿名类:

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

从java8开始可以使用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));

需要注意的是Collections.sort(...) 是只能用在List的子类型,Set和Collection apis不包含元素排序。


Map排序

你可以进入HasMap的实体给value类似的排序。(注意,LinkedHasMap必须使用标签,键值在普通HasMap里是无序的)

Map map = new HashMap();  // ... or any other Map class
// populate the map
map = map.entrySet()
    .stream()
    .sorted(Map.Entry.comparingByValue())
    .collect(Collectors.toMap(k -> k.getKey(), v -> v.getValue(),
                              (k, v) -> k, LinkedHashMap::new));












你可能感兴趣的:(翻译—博客)