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

Zzo*_*okk 6 kotlin

我正在使用sortedBy()对对象集合进行排序。

由于顺序可能会根据用户的选择而变化,因此我最终得到了以下代码

val sortedList = if (sortingOrder == WordSortingOrder.BY_ALPHA) {
                    list.sortedBy { it.word.value }
                } else {
                    list.sortedBy { it.createdAt }
                }
Run Code Online (Sandbox Code Playgroud)

然后我对排序后的集合执行进一步的操作。我意识到该sortedBy()方法需要返回一个属性。我想知道是否有一种方法可以将排序条件嵌入到一个收集方法链中。

Ily*_*lya 5

如果你的属性是不同类型的,你将无法选择基于一些条件,作为结果他们中的一个sortedBy,因为他们共同的超类型将被推断为Any,这是不是一个亚型Comparable<R>sortedBy预期。

相反,您可以使用sortedWith方法,该方法采用Comparator,并根据条件提供比较器:

list.sortedWith(
    if (sortingOrder == WordSortingOrder.BY_ALPHA)
        compareBy { it.word.value }
    else
        compareBy { it.createdAt }
)
Run Code Online (Sandbox Code Playgroud)

此处使用该kotlin.comparisons.compareBy函数创建了不同属性的比较器。

然后,您可以提取基于排序顺序选择比较器的逻辑到函数:

list.sortedWith(comparatorFor(sortingOrder))

fun comparatorFor(sortingOrder: WordSortingOrder): Comparator<MyType> = ...
Run Code Online (Sandbox Code Playgroud)