我从官方文件中得知

我知道对于普通属性(比如这里的整数值)必须如何处理,但是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]

推荐答案

您的代码提供了两个 Select 器,分别为varargcompareBy:

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

深入挖掘数据源,我们得到了任何两个值abComparator:Comparator { 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
}

最后一段代码演示了,如果所有 Select 器具有相同的diff,则ab被视为相等,否则first Select 器将具有diff!=0来决定.

布尔人是可比的.将4与任何其他值(例如2)进行比较时,您将得到:

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

所以4比任何非4的值都小

Kotlin相关问答推荐

如何确保Kotlin子类已完成初始化?

Kotlin多平台(KMP)保存到文件不能在iOS上保存

如何创建一个空的kotlin工作?

用Quarkus和Reactor重写异步过滤器中的数据流

Kotlin 获取继承类的默认 hashCode 实现

如何使用成员引用在 Kotlin 中创建属性的分层路径

多个不同的指针输入

如何连接两个 kotlin 流?

如何从 kotlin 函数中 Select 正确的枚举值

在 kotlin 中模拟伴随对象函数

参考 Kotlin 中的 Java 接口静态字段

Anko 中的水平线性布局

kotlin 扩展属性的惰性初始化器中的这个引用

如何使用 Coil 从 URL 获取位图?

如何在主线程上使用 Kotlin 协程 await()

Firestore - 如何在 Kotlin 中排除数据类对象的字段

在Kotlin中使用@Service时引发异常

从命令行运行Java到Kotlin转换器?

内联 onFocusChange kotlin

在 kotlin 中,如何将主构造函数中的属性设置器设为私有?