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

Kotlin如何同时对列表排序并过滤指定对象?

Kotlin 过滤无效元素后排序的实现方法

原代码无法运行的核心问题是直接访问了可能为null的obj.postTime,同时没有排除tag为"invalid"的无效对象。解决思路是先过滤掉无效元素,再执行排序,具体实现如下:

推荐实现方式(可读性优先)

class TheObj(val postTime: Long, val tag: String)

val srcList = mutableListOf(
    TheObj(2022, "a"),
    TheObj(2020, "b"),
    null,
    TheObj(2021, "c"),
    TheObj(2020, "invalid")
)

// 过滤+排序逻辑
val desSortedList = srcList
    .filterNotNull() // 移除所有null对象
    .filter { it.tag != "invalid" } // 移除tag为"invalid"的对象
    .sortedByDescending { it.postTime } // 按postTime降序排序

desSortedList.forEach { println(it.postTime) }

代码说明

  1. filterNotNull():直接过滤列表中所有null元素,确保后续操作的对象都是非空的TheObj实例。
  2. filter { it.tag != "invalid" }:筛选出tag不等于"invalid"的有效对象。
  3. sortedByDescending { it.postTime }:对过滤后的有效列表,按postTime从大到小排序。

执行这段代码后,输出结果为:

2022
2021
2020

合并过滤条件的写法(简洁版)

如果想把过滤逻辑合并到一个filter中,也可以这样写:

val desSortedList = srcList
    .filter { obj -> obj != null && obj.tag != "invalid" }
    .sortedByDescending { it!!.postTime }

这里通过obj != null先排除null,再判断tag,最后用it!!断言对象非空(因为filter已经保证了这一点),效果和上面的写法一致,但可读性稍弱。

内容的提问来源于stack exchange,提问作者lannyf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:10:47