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

如何生成内部Locker已排序过滤的ParcelBoxByID新实例

处理ParcelBoxByID中的Locker列表:过滤与排序

没问题,这事儿用Kotlin的data class特性和集合操作就能轻松搞定。因为ParcelBoxByID是data class,我们可以用它自带的copy()方法创建新实例,同时对lockers列表做过滤和排序处理,完全不用修改原实例。

核心解决方案

写个扩展函数是最方便的,这样你可以直接在ParcelBoxByID实例上调用这个方法:

fun ParcelBoxByID.processLockers(): ParcelBoxByID {
    // 第一步:过滤掉status为"0"的Locker;第二步:按status字段排序
    val processedLockers = lockers
        .filter { it.status != "0" }
        .sortedBy { it.status }

    // 用copy方法创建新实例,替换处理后的lockers列表
    return copy(lockers = processedLockers)
}

怎么用?

就像调用普通方法一样简单:

val originalParcelBox: ParcelBoxByID = // 你的原始实例
val processedParcelBox = originalParcelBox.processLockers()

进阶:自定义排序规则

如果status的排序不是简单的字符串字典序(比如你希望"available"优先于"occupied"),可以用sortedWith()配合自定义Comparator:

// 定义你想要的status优先级顺序
val statusPriority = mapOf(
    "available" to 0,
    "occupied" to 1,
    "maintenance" to 2
)

fun ParcelBoxByID.processLockersWithCustomSort(): ParcelBoxByID {
    val processedLockers = lockers
        .filter { it.status != "0" }
        .sortedWith { a, b ->
            // 按自定义优先级排序,不在映射里的status放到最后
            val priorityA = statusPriority[a.status] ?: Int.MAX_VALUE
            val priorityB = statusPriority[b.status] ?: Int.MAX_VALUE
            priorityA.compareTo(priorityB)
        }

    return copy(lockers = processedLockers)
}

为什么用copy()?

因为ParcelBoxByID的所有属性都是val(除了Locker里的几个var),Kotlin的data class自动生成的copy()方法可以让我们轻松复制实例,同时只修改需要变更的lockers属性,原实例会保持不变,这也符合函数式编程的不可变原则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:11:45