一、单字段排序
先造点数据
pigs.add(new Pig(1, "猪爸爸", 31, "M", false));
pigs.add(new Pig(2, "猪妈妈", 28, "F", true));
pigs.add(new Pig(3, "乔治", 2, "M", false));
pigs.add(new Pig(4, "佩奇", 5, "F", false));
按照id升序
pigs.sort(comparing(Pig::getId));
按照id降序
pigs.sort(comparing(Pig::getId).reversed());
二、多字段排序
根据性别gender升序,再以年龄age升序
pigs.sort(
comparing(Pig::getGender)
.thenComparing(Pig::getAge)
);
根据性别gender升序,再以年龄age降序
注意:下面的reversed()在thenComparing()里面
pigs.sort(
comparing(Pig::getGender)
.thenComparing(comparing(Pig::getAge).reversed())
);
根据性别gender降序,再以年龄age升序
pigs.sort(
comparing(Pig::getGender).reversed()
.thenComparing(Pig::getAge)
);
根据性别gender降序,再以年龄age降序
注意:下面的reversed()在thenComparing()外面
pigs.sort(
comparing(Pig::getGender)
.thenComparing(Pig::getAge)
.reversed()
);
三、Null值参与排序
如果集合中某个数据的某个字段值是null,那就得特殊处理,否则报异常。
再添加一行数据,其中age=null
pigs.add(new Pig(5, "米可", null, "F", false));
null值排在前面
pigs.sort(comparing(Pig::getAge, Comparator.nullsFirst(Integer::compareTo)));
null值排在后面
pigs.sort(comparing(Pig::getAge, Comparator.nullsLast(Integer::compareTo)));
四、同时Null值排序和多字段排序
学了上面的知识,考一考如何同时处理Null值排序和多字段排序?
那就是下面这么写
pigs.sort(
comparing(Pig::getGender)
.thenComparing(Pig::getAge, Comparator.nullsFirst(Integer::compareTo))
);
五、List<Map<String, Object>> 排序
List<Map<String, Object>> cats = new ArrayList<>();
Map<String,Object> cat1 = new HashMap<>();
cat1.put("name", "cat1");
cat1.put("age", 10);
cats.add(cat1);
Map<String,Object> cat2 = new HashMap<>();
cat2.put("name", "cat2");
cat2.put("age", 2);
cats.add(cat2);
List<Map<String, Object>> sortedCats = cats.stream().sorted((map1, map2) -> {
int age1 = (int) map1.getOrDefault("age", 0);
int age2 = (int) map2.getOrDefault("age", 0);
return age1 - age2;
}).collect(Collectors.toList());
sortedCats.forEach(System.out::println);
多字段排序
System.out.println("List<Map> 根据age降序, 再根据sex降序,sex默认M");
userMaps.sort((map1, map2) -> {
int age1 = (int) map1.getOrDefault("age", 0);
int age2 = (int) map2.getOrDefault("age", 0);
if (age1 == age2) {
String sex1 = (String) map1.getOrDefault("sex", "M");
String sex2 = (String) map2.getOrDefault("sex", "M");
return sex2.compareTo(sex1);
} else {
return age2 - age1;
}
});
userMaps.forEach(System.out::println);