java根据某字段分组并筛选出最新的数据
原数据
[{"deviceNumber":"1617423","turnonLasttime":"2020-9-20 00:00:00","unitName":"测试1"},
{"deviceNumber":"1617423","turnonLasttime":"2022-10-18 00:00:00","unitName":"测试2"},
{"deviceNumber":"1614323","turnonLasttime":"2020-7-21 00:00:00","unitName":"测试1"},
{"deviceNumber":"1614323","turnonLasttime":"2022-11-12 00:00:00","unitName":"测试2"},
{"deviceNumber":"1663323","turnonLasttime":"","unitName":"测试1"},
{"deviceNumber":"1663323","turnonLasttime":"2022-11-12 00:00:00","unitName":"测试2"},
{"deviceNumber":"1654544","turnonLasttime":"","unitName":"测试1"},
{"deviceNumber":"1654544","turnonLasttime":"","unitName":"测试2"},
{"deviceNumber":"1654543","turnonLasttime":"2020-7-21 00:00:00","unitName":"测试1"},
{"deviceNumber":"1654543","turnonLasttime":"2020-7-21 00:00:00","unitName":"测试2"}]
根据deviceNumber分组,根据turnonLasttime时间取最新
都为空或时间相同随机取(取遍历时最后一个)
一个为空取不为空的
//分组并筛选最新的数据
List<DeviceSync> collect = new ArrayList<>(deviceSyncs.stream().collect(Collectors.toMap(
DeviceSync::getDeviceNumber,
v->v,
(v1,v2)->{
if (v1.getTurnonLasttime() == null || v2.getTurnonLasttime() == null){
return v1.getTurnonLasttime() != null?v1:v2; //拿到不为空的,都为空取后一条
}
LocalDate startDate = v1.getTurnonLasttime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate startDate1 = v2.getTurnonLasttime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
return startDate.isAfter(startDate1) || startDate.isEqual(startDate1) ? v1:v2;
}
)).values());
筛选后数据
[{"deviceNumber":"1617423","turnonLasttime":"2022-10-18 00:00:00","unitName":"测试2"},
{"deviceNumber":"1614323","turnonLasttime":"2022-11-12 00:00:00","unitName":"测试2"},
{"deviceNumber":"1663323","turnonLasttime":"2022-11-12 00:00:00","unitName":"测试2"},
{"deviceNumber":"1654544","turnonLasttime":"","unitName":"测试2"},
{"deviceNumber":"1654543","turnonLasttime":"2020-7-21 00:00:00","unitName":"测试2"}]
有错欢迎大家指出
版权声明:本文为weixin_43998503原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。