用stream流实现筛选过滤判空排序分组功能

前言

在针对想要对list集合进行判空筛选、分组排序且返回的list有空值,空值如何排序的业务需求时,可用sorted和Comparator结合进行排序,Collectors.groupingBy进行判空。其代码如下,大家可作参考!

使用 Stream的sort() 方法,并结合 Comparator 类 进行排序,主要解决以下两个问题:

1)当某个字段为空时,怎么进行排序?—使用 Comparator.nullsFirst() 或者 Comparator.nullsLast( ) 进行非空的剔除

代码

 @Test
    public void streamSortTest() {
        Role role = new Role();
        role.setAge("12");
        role.setName("张");
        Role role1 = new Role();
        Role role2 = new Role();
        Role role3 = new Role();
        role1.setAge("10");
        role1.setName("笑");
        role2.setAge(" ");
        role2.setName("");
        role3.setAge("13");
        role3.setName("的");

        List<Role> roleList = Arrays.asList(role, role1, role2, role3);
       List<Role> roleList = Arrays.asList(role, role1, role2, role3);
        Map<String,
                List<Role>> last = roleList.stream().filter(a -> a.getAge() != null)
                                           .sorted(Comparator.comparing(Role::getAge, Comparator.nullsFirst(String::compareTo)))
                                           .collect(Collectors.groupingBy(Role::getAge, LinkedHashMap::new, Collectors.toList()));

        LinkedHashMap<String, List<Role>> noNull = roleList.stream().sorted(Comparator.comparing(Role::getAge, Comparator.nullsLast(String::compareTo)).reversed()).collect(Collectors.groupingBy(Role::getName, LinkedHashMap::new, Collectors.toList()));
        LinkedHashMap<String, List<Role>> nullLast = roleList.stream().filter(a -> a.getAge() != null).sorted(Comparator.comparing(Role::getAge, Comparator.nullsLast(String::compareTo)).reversed()).collect(Collectors.groupingBy(Role::getName, LinkedHashMap::new, Collectors.toList()));
        LinkedHashMap<String, List<Role>> nullFirst = roleList.stream().filter(a -> a.getAge() != null).sorted(Comparator.comparing(Role::getAge, Comparator.nullsFirst(String::compareTo)).reversed()).collect(Collectors.groupingBy(Role::getName, LinkedHashMap::new, Collectors.toList()));

        List<Role> collect1 = roleList.stream().filter(a -> a.getAge() != null).sorted(Comparator.comparing(Role::getAge, Comparator.nullsFirst(String::compareTo))).collect(Collectors.toList());
        System.out.println("不加filter:" + JSON.toJSONString(noNull));
        System.out.println("分组nullsLast:" + JSON.toJSONString(nullLast));
        System.out.println("分组nullsFirst:" + JSON.toJSONString(nullFirst));
        System.out.println("(默认升序)nullsLast空的排序的前面:" + JSON.toJSONString(last));
        System.out.println(JSON.toJSONString(collect1));


    }

上面代码的结果:

1. 不加filter:{"的":[{"age":"13","name":"的"}],"张":[{"age":"12","name":"张"}],"笑":[{"age":"10","name":"笑"}],"":[{"age":" ","name":""}]}
2.分组nullsLast:{"的":[{"age":"13","name":"的"}],"张":[{"age":"12","name":"张"}],"笑":[{"age":"10","name":"笑"}],"":[{"age":" ","name":""}]}
3.分组nullsFirst:{"的":[{"age":"13","name":"的"}],"张":[{"age":"12","name":"张"}],"笑":[{"age":"10","name":"笑"}],"":[{"age":" ","name":""}]}
4.(默认升序)nullsLast空的排序的前面:{" ":[{"age":" ","name":""}],"10":[{"age":"10","name":"笑"}],"12":[{"age":"12","name":"张"}],"13":[{"age":"13","name":"的"}]}
5. [{"age":" ","name":""},{"age":"10","name":"笑"},{"age":"12","name":"张"},{"age":"13","name":"的"}]

结果分析:

1, Comparator.nullsLast和Comparator.nullsFirst的区别
nullsLast产生的list结果中有空值的是会排到最前面的,nullsFirst是排在最后面的。
注意:是在不分组的情况下才能正确输出结果。但是这有一个疑问:我用nullsFirst和nullsLast输出的有空值的都是排在第一个(且这里的数据是升序的形式)
2,filter和nullsLast或是nullsFirst一起用值得注意的地方
根据上面结果会发现key——>value对应的value无值时,list中同样有该数据。经过验证发现只有对应的key不存在时,整个k-v才不会出现。但这是因为filter中的判空是!=null,所以这里一定要注意对string类型的判空方式。

结尾:关于stream流中的用法还很多,下篇将会讲解stream中的foreEach的用法示例~

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值