如何用Kotlin从日期列表中找出所有最近的日期?
Kotlin实现筛选最晚日期数据的惯用写法
核心思路
要完成需求,关键是先将字符串格式的日期转为可比较的时间对象,再找出最晚日期对应的所有条目,用Kotlin标准库的集合函数可以简洁实现。
代码实现
1. 定义数据类
先映射服务器返回的数据结构:
data class Result(val date: String, val id: Int)
2. 日期解析工具
服务器返回的日期格式为MMM d, yyyy h:mm:ss a(如May 9, 2020 8:09:03 PM),需用DateTimeFormatter解析为可比较的LocalDateTime对象:
import java.time.LocalDateTime import java.time.format.DateTimeFormatter import java.util.Locale // 匹配英文日期格式的解析器,Locale必须指定为英文,否则月份缩写解析失败 private val dateFormatter = DateTimeFormatter.ofPattern("MMM d, yyyy h:mm:ss a", Locale.ENGLISH) // 扩展函数:将字符串日期转为LocalDateTime fun String.toLocalDateTime(): LocalDateTime = LocalDateTime.parse(this, dateFormatter)
3. 筛选最晚日期条目
直观写法(分步清晰)
fun main() { val serverResults = listOf( Result("May 9, 2020 8:09:03 PM", 1), Result("Apr 14, 2020 8:09:03 PM", 2), Result("Mar 15, 2020 8:09:03 PM", 3), Result("May 9, 2020 8:19:03 PM", 4) ) // 1. 为每个Result绑定解析后的时间对象 val resultsWithTime = serverResults.map { it to it.date.toLocalDateTime() } // 2. 找出所有时间中的最大值(即最晚日期) val latestTime = resultsWithTime.maxOfOrNull { it.second } // 3. 筛选出所有时间等于最晚日期的Result val latestResults = latestTime?.let { time -> resultsWithTime.filter { it.second == time }.map { it.first } } ?: emptyList() println(latestResults) // 输出:[Result(date=May 9, 2020 8:09:03 PM, id=1), Result(date=May 9, 2020 8:19:03 PM, id=4)] }
简化链式写法(Kotlin惯用风格)
利用groupBy按时间分组,直接取时间最大的分组:
val latestResults = serverResults.groupBy { it.date.toLocalDateTime() } .maxByOrNull { it.key } ?.value ?: emptyList()
异常处理优化
如果存在格式错误的日期,可添加解析容错逻辑,避免程序崩溃:
// 扩展函数:解析失败返回null fun String.toLocalDateTimeOrNull(): LocalDateTime? = runCatching { LocalDateTime.parse(this, dateFormatter) }.getOrNull() // 筛选时跳过解析失败的条目 val latestResults = serverResults.mapNotNull { result -> result.date.toLocalDateTimeOrNull()?.let { result to it } }.let { resultsWithTime -> resultsWithTime.maxOfOrNull { it.second }?.let { latestTime -> resultsWithTime.filter { it.second == latestTime }.map { it.first } } ?: emptyList() }
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

