如何从List<Work>列表中筛选匹配规则元素并取同组最高版本?
Kotlin列表分组筛选最高版本实现
需求说明
持有存储Work模型元素的列表,Work模型包含字段:id、title、number、version number。需要实现两个筛选规则:
- 过滤掉
version number为空的元素 - 对
title + number组合相同的元素分组,每组仅保留version number值最高的元素
示例
原列表元素(按title、number、version顺序排列):
Running (120:1) Running (120:2) Running (120:3) Climbing (55:1) Climbing (55:2) Climbing (55:3) Climbing (55:4)
期望筛选后结果:
Running (120:3) Climbing (55:4)
现有问题
当前编写的代码逻辑不完整,尝试用正则匹配的思路完全没必要,Kotlin标准库提供的分组、聚合函数可以直接实现需求,不需要写正则匹配。
原有残缺代码:
private fun List<Work>.filterByVersion(): List<Work> { work.version_number != null }.filter { work -> ("${work.title} ${work.number}:${work.version_number}").contains("no idea of regex here") } }
完整实现代码
private fun List<Work>.filterByVersion(): List<Work> { // 先过滤version_number为空的条目 return filter { it.version_number != null } // 按title+number的组合分组,用二元组做key比拼接字符串更可靠,避免字段内容拼接冲突 .groupBy { it.title to it.number } // 每组取version_number最大的条目 .mapValues { (_, sameGroupItems) -> sameGroupItems.maxBy { it.version_number!! } } // 取出筛选后的结果转为列表 .values.toList() }
注意点
- 前面已经过滤了
version_number为空的条目,所以取最大值时用非空断言!!不会触发空指针异常 - 该实现返回的结果顺序和每个分组首次在原列表出现的顺序一致,和示例期望的输出顺序匹配;如果需要自定义排序,可以在返回结果前追加
sortedBy等排序逻辑 - 不需要用正则做字符串匹配,分组操作直接操作模型字段,性能和可维护性都更好
内容的提问来源于stack exchange,提问作者chrisChris
相关产品推荐
相关产品推荐

