compareBy如何在Kotlin中使用布尔表达式工作

oprakyz7  于 2022-12-19  发布在  Kotlin
关注(0)|答案(2)|浏览(147)

我从官方文档中了解到compareBy creates a comparator using the sequence of functions to calculate a result of comparison. The functions are called sequentially, receive the given values a and b and return Comparable objects
我知道对于普通属性(如这里的整数值)必须如何执行此操作,但是compareBy如何处理布尔条件呢?
在这个例子中,我打算把所有的4放在列表的顶部,然后按值的升序排序,但是我不确定这个布尔表达式如何帮助我做到这一点!

fun main(args: Array<String>) {
    var foo = listOf(2, 3, 4, 1, 1, 5, 23523, 4, 234, 2, 2334, 2)
    
    foo = foo.sortedWith(compareBy({
        it != 4
    },{
        it
    }))
    
    print(foo)
}

产出

[4, 4, 1, 1, 2, 2, 2, 3, 5, 234, 2334, 23523]
pexxcrt2

pexxcrt21#

public class Boolean private constructor() : Comparable<Boolean>

所以当你在compareBy中返回it != 4时,你使用的是Boolean的排序顺序,即false〈true,你的表达式只有在it == 4时才是false,而且你确实可以看到4是输出中的第一个元素。

6ie5vjzr

6ie5vjzr2#

您的代码提供了两个选择器作为varargcompareBy

foo.sortedWith(
        compareBy(
            { it != 4 },
            { it }
        )
)

深入研究源代码,我们可以得到Comparator,它对应于构建的任意两个值abComparator { a, b -> compareValuesByImpl(a, b, selectors) }
最后:

private fun <T> compareValuesByImpl(a: T, b: T, selectors: Array<out (T) -> Comparable<*>?>): Int {
    for (fn in selectors) {
        val v1 = fn(a)
        val v2 = fn(b)
        val diff = compareValues(v1, v2)
        if (diff != 0) return diff
    }
    return 0
}

最后一个代码片段演示了如果所有选择器都有相同的diff,则ab被认为是相等的,否则diff!= 0的first选择器获胜。
布尔值具有可比性。当将4与任何其他值(比如2)进行比较时,您将得到:

4 != 4 false
2 != 4 true
diff = false.compareTo( true ) == -1

因此,对于排序,4“小于”任何非4的值

相关问题