如何在Kotlin中对Stream按orderIndex和amount双字段排序?
Kotlin实现多条件嵌套字段排序
没问题,在Kotlin里实现这种多条件排序其实比Java更简洁,核心思路和你找到的Java示例一致,只是语法更灵活,完全能轻松处理嵌套对象的字段访问。
先给你直接升级后的代码,替换你原来的排序逻辑:
// 写法1:合并在一个compareBy里,简洁紧凑 result.sortedWith(compareBy({ it.intervalType.orderIndex }, { it.item.amount })) // 写法2:链式调用,可读性更高(推荐) result.sortedWith( compareBy { it.intervalType.orderIndex } .thenBy { it.item.amount } )
为什么这样能解决嵌套字段的问题?
Kotlin的compareBy和thenBy都接受lambda表达式,你可以在lambda里直接访问对象的任意嵌套属性——不管是s.intervalType.orderIndex这种多层嵌套的内部对象字段,还是s.item.amount这种自身的嵌套属性,lambda都能直接穿透访问,不需要额外的方法引用语法(当然你想用方法引用也可以,比如如果intervalType有getOrderIndex()方法,也能写compareBy(IntervalType::getOrderIndex),但lambda写法更直观)。
补充:如果需要降序排序
如果你的amount需要按从大到小排序,只需要把thenBy换成thenByDescending就行:
result.sortedWith( compareBy { it.intervalType.orderIndex } .thenByDescending { it.item.amount } )
和你找到的Java示例对比
Java里用Comparator.comparing().thenComparing(),Kotlin里对应的就是compareBy().thenBy(),逻辑完全一致,但Kotlin的lambda写法让嵌套字段的访问更直接,不需要处理方法引用的适配问题,写起来更顺手。
这样修改后,你的列表就会先按orderIndex从小到大排序,当两个条目orderIndex相同时,再按amount排序(默认升序,可调整为降序),完全符合你的需求。
内容的提问来源于stack exchange,提问作者Sahbaz
相关产品推荐
相关产品推荐

