我正在使用 sortedBy()
对对象集合进行排序。
由于顺序可能会根据用户的选择而变化,因此我最终得到了以下代码
val sortedList = if (sortingOrder == WordSortingOrder.BY_ALPHA) {
list.sortedBy { it.word.value }
} else {
list.sortedBy { it.createdAt }
}
然后我对排序后的集合执行进一步的操作。
我意识到
sortedBy()
方法期望返回一个属性。我想知道是否有一种方法可以将排序条件嵌入到一个收集方法链中。
最佳答案
如果您的属性是不同类型的,您将无法根据某些条件选择其中之一,结果 sortedBy
,因为它们的共同父类(super class)型将被推断为 Any
它不是 Comparable<R>
的子类型如 sortedBy
期待。
相反,您可以使用 sortedWith
方法,它需要一个 Comparator
,并根据条件提供比较器:
list.sortedWith(
if (sortingOrder == WordSortingOrder.BY_ALPHA)
compareBy { it.word.value }
else
compareBy { it.createdAt }
)
此处使用
kotlin.comparisons.compareBy
创建不同属性的比较器功能。然后,您可以提取基于排序顺序选择比较器的逻辑到函数:
list.sortedWith(comparatorFor(sortingOrder))
fun comparatorFor(sortingOrder: WordSortingOrder): Comparator<MyType> = ...
关于kotlin - 在 Kotlin 中使用条件选择排序属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38829617/