You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 11:09:14