Java8 Stream(6)List集合排序 多字段排序 Null值排序

一、单字段排序

先造点数据

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);
  • 18
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑟 王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值