天天看點

Java8 Stream(6)List集合排序 多字段排序 Null值排序一、單字段排序二、多字段排序三、Null值參與排序四、同時Null值排序和多字段排序五、List<Map<String, Object>> 排序

一、單字段排序

先造點資料

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升序

按照id降序

二、多字段排序

根據性别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

null值排在前面

null值排在後面

四、同時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);