Java Groovy中如何过滤map列表,按name+doc分组保留最新日期数据
实现思路
- 第一步:以
name和doc的组合作为分组键,对列表中的所有Map进行分组 - 第二步:遍历每个分组,对分组内的条目按
date字段降序排序,取排序后的第一条(即日期最新的条目) - 第三步:把所有分组取出的最新条目重新整合为结果列表即可
代码实现
如果你的date字段已经是Groovy Date类型,直接使用以下核心逻辑即可:
// 示例原始数据(date已为Date类型的场景) def originalList = [ [name: 'name1', date: Date.parse("EEE MMM dd HH:mm:ss z yyyy", "Sat Oct 01 00:00:00 CEST 2021"), doc: 'doc1'], [name: 'name2', date: Date.parse("EEE MMM dd HH:mm:ss z yyyy", "Sun Oct 14 00:00:00 CEST 2021"), doc: 'doc1'], [name: 'name2', date: Date.parse("EEE MMM dd HH:mm:ss z yyyy", "Sat Oct 23 00:00:00 CEST 2021"), doc: 'doc2'], [name: 'name2', date: Date.parse("EEE MMM dd HH:mm:ss z yyyy", "Sat Oct 15 00:00:00 CEST 2021"), doc: 'doc2'], [name: 'name2', date: Date.parse("EEE MMM dd HH:mm:ss z yyyy", "Sat Oct 04 00:00:00 CEST 2021"), doc: 'doc3'], [name: 'name2', date: Date.parse("EEE MMM dd HH:mm:ss z yyyy", "Sat Oct 11 00:00:00 CEST 2021"), doc: 'doc4'], [name: 'name3', date: Date.parse("EEE MMM dd HH:mm:ss z yyyy", "Sat Oct 20 00:00:00 CEST 2021"), doc: 'doc1'], [name: 'name3', date: Date.parse("EEE MMM dd HH:mm:ss z yyyy", "Sat Oct 03 00:00:00 CEST 2021"), doc: 'doc2'], ] // 核心处理逻辑 def result = originalList.groupBy { [it.name, it.doc] } // 按name+doc组合分组 .values() // 提取所有分组的内容 .collect { group -> group.max { it.date } // 每个分组取date最大的最新条目 } // 结果验证 result.each { println it }
如果你的
date字段当前是字符串格式,仅需要修改max方法的比较逻辑,先把字符串转为Date类型即可:
def result = originalList.groupBy { [it.name, it.doc] } .values() .collect { group -> group.max { Date.parse("EEE MMM dd HH:mm:ss z yyyy", it.date) } }
结果说明
运行代码后会自动过滤同name同doc组合下日期更早的条目,你示例中被注释的10月15日的条目会被过滤,仅保留10月23日的同组合最新条目,最终得到符合要求的去重列表。
内容的提问来源于stack exchange,提问作者Filipe Madureira
相关产品推荐
相关产品推荐

