Java使用Lambda表达式对集合进行排序
示例
排序清单
在Java8之前,对java.util.Comparator列表1进行排序时,必须使用匿名(或命名)类实现接口:
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));
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));