compareBy如何使用布尔表达式在kotlin中工作
How does compareBy work in kotlin using a boolean expression
我从官方文档中知道 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]
Boolean
是 Comparable
public class Boolean private constructor() : Comparable<Boolean>
因此,当您在 compareBy
中返回 it != 4
时,您使用的是 Boolean
的排序顺序,即 false < true。仅当 it == 4
时,您的表达式才为假,实际上您可以将 4 视为输出中的第一个元素。
您的代码提供了两个选择器作为 vararg
到 compareBy
:
foo.sortedWith(
compareBy(
{ it != 4 },
{ it }
)
)
深入研究资源,我们有一个 Comparator
用于任何两个值 a
和 b
建立: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
}
最后一个代码片段表明,如果所有选择器都具有相同的 diff
,则 a
和 b
被认为是相等的,否则 第一个 diff != 0 的选择器决定。
布尔值是可比较的。当将 4 与任何其他值(比如 2)进行比较时,您将得到:
4 != 4 false
2 != 4 true
diff = false.compareTo( true ) == -1
因此,对于排序,4“小于”任何不是 4 的值
我从官方文档中知道 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]
Boolean
是 Comparable
public class Boolean private constructor() : Comparable<Boolean>
因此,当您在 compareBy
中返回 it != 4
时,您使用的是 Boolean
的排序顺序,即 false < true。仅当 it == 4
时,您的表达式才为假,实际上您可以将 4 视为输出中的第一个元素。
您的代码提供了两个选择器作为 vararg
到 compareBy
:
foo.sortedWith(
compareBy(
{ it != 4 },
{ it }
)
)
深入研究资源,我们有一个 Comparator
用于任何两个值 a
和 b
建立: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
}
最后一个代码片段表明,如果所有选择器都具有相同的 diff
,则 a
和 b
被认为是相等的,否则 第一个 diff != 0 的选择器决定。
布尔值是可比较的。当将 4 与任何其他值(比如 2)进行比较时,您将得到:
4 != 4 false
2 != 4 true
diff = false.compareTo( true ) == -1
因此,对于排序,4“小于”任何不是 4 的值