用java 8 stream 排序 LIst 以及自定义对象比较器
- 主要比较的是时间,但是时间为最近时间,java中compareto方法比较的ACSII码所以2020和2021肯定是0在前面,但是我们需要的是最近的日期在前面,所以我们对返回的结果做出来取反,正常情况 对象1的edittime和对象2的time比较的是 如果对象1的time小于对象2的time就会返回 1 ,所有我们会发现2020在前面,我们只需要取反,因为 compareto 的结果只有三种 一种是1 升序,-1降序, 0是相等的意思( String类实现了Comparable接口。CompareTo方法相等返回0,升序返回1,降序返回-1),这里
可以理解为什么取反吗?因为取反之后2021-09-06的就可以在前面啦。就可以按照最近时间的顺序进行排序啦。
如果有的java 8 stream 不懂的可以去看看哦
List<Map<String,Object>> resultList = null;
Map<String,Object> ss1 = new HashMap<>();
ss1.put("dictcode","2");
ss1.put("DictValue","霓虹灯广告1");
ss1.put("EditTime","2021-09-16 17:47:30");
Map<String,Object> ss2 = new HashMap<>();
ss2.put("dictcode","1");
ss2.put("DictValue","霓虹灯广告2");
ss2.put("EditTime","2020-04-16 17:47:30");
Map<String,Object> ss3 = new HashMap<>();
ss3.put("dictcode","21");
ss3.put("DictValue","霓虹灯广告3");
ss3.put("EditTime","2020-09-13 17:47:30");
Map<String,Object> ss4 = new HashMap<>();
ss4.put("dictcode","3");
ss4.put("DictValue","霓虹灯广告4");
ss4.put("EditTime","2020-09-16 17:47:30");
Map<String,Object> ss5 = new HashMap<>();
ss5.put("dictcode","4");
ss5.put("DictValue","霓虹灯广告5");
ss5.put("EditTime","2020-09-16 17:47:30");
List<Map<String, Object>> maps = Arrays.asList(ss1, ss2, ss3, ss5, ss4);
maps.stream().sorted((o1, o2) -> {
if (StringUtils.isEmpty(o1.get("EditTime").toString()) || StringUtils.isEmpty(o2.get("EditTime").toString())) {
return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
} else if (o1.get("EditTime").equals(o2.get("EditTime"))) {
return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
} else
if (o1.get("EditTime").toString().compareTo(o2.get("EditTime").toString()) > 0)
return -1;
else return 1;
}).collect(Collectors.toList()).forEach(System.out::println);
- 可能上面的判断条件看起来不是那么优雅,那么我们既然会多字段啦,那么我们就闲着没事儿去让它跟优雅,让别人惊叹!话不多说直接上代码。
Comparator<Advertising> adsComparator = Comparator.comparing(Advertising::getEditTime).reversed().thenComparing(Comparator.comparing(Advertising::getDictcode);
AdsList.stream().sorted(adsComparator).collect(Collectors.toList()).forEach(System.out::println);