list排序
在java8之前,给list排序需要使用实现java.util.Comparator接口的匿名类:
List<Person> people = ...
Collections.sort(
people,
new Comparator<Person>() {
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<String, Integer> map = new HashMap(); // ... or any other Map class
// populate the 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));