前言
在针对想要对list集合进行判空筛选、分组排序且返回的list有空值,空值如何排序的业务需求时,可用sorted和Comparator结合进行排序,进行判空。其代码如下,大家可作参考!
使用 Stream的sort() 方法,并结合 Comparator 类 进行排序,主要解决以下两个问题:
1)当某个字段为空时,怎么进行排序?—使用 () 或者 ( ) 进行非空的剔除
代码
@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, 和的区别
nullsLast产生的list结果中有空值的是会排到最前面的,nullsFirst是排在最后面的。
注意:是在不分组的情况下才能正确输出结果。但是这有一个疑问:我用nullsFirst和nullsLast输出的有空值的都是排在第一个(且这里的数据是升序的形式)
2,filter和nullsLast或是nullsFirst一起用值得注意的地方
根据上面结果会发现key——>value对应的value无值时,list中同样有该数据。经过验证发现只有对应的key不存在时,整个k-v才不会出现。但这是因为filter中的判空是!=null,所以这里一定要注意对string类型的判空方式。
结尾:关于stream流中的用法还很多,下篇将会讲解stream中的foreEach的用法示例~