如何生成内部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
相关产品推荐
相关产品推荐

