kotlin - 在 Kotlin 中使用条件选择排序属性

标签 kotlin

我正在使用 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/

相关文章:

android - android studio 3.0.1和kotlin v1.2.10-release-Studio3.0-1出现问题

kotlin - `var allByDefault: Int ?`会导致错误吗?

android - 为什么来自 Kotlin May 更新的新 LiveData 构建器在我的项目中不起作用

android - Mockito 无法模拟/监视,因为 : Final Class

android - Dagger -Android : Missing setters for modules

arrays - Kotlin从2个数组中过滤最大值的方法?

android - 为什么将 Dagger 与 Android 架构组件一起使用

android - 使用postgresql在android studio(kotlin)中插入记录

reactjs - 如何修复它?错误任务:expo:compileDebugKotlin FAILED

java - 如何使用它的片段使RelativeLayout 可滚动? - Kotlin