Sé por la documentación oficial que 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 .
Sé cómo se debe hacer esto para atributos normales como el valor entero aquí, pero ¿cómo maneja compareBy las condiciones booleanas?
En este ejemplo, tenía la intención de mantener los 4 en la parte superior de la lista y luego clasificarlos en orden ascendente de valores, ¡pero no estoy seguro de cómo esta expresión booleana me ayuda a hacer esto!
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) }Producción
[4, 4, 1, 1, 2, 2, 2, 3, 5, 234, 2334, 23523]Boolean es Comparable
public class Boolean private constructor() : Comparable<Boolean> Entonces, cuando lo devuelve it != 4 en compareBy , está usando el orden de clasificación de Boolean , es decir, falso <verdadero. Su expresión es falsa solo cuando it == 4 y, de hecho, puede ver los 4 como los primeros elementos en la salida.
Su código proporciona dos selectores como vararg para compareBy por:
foo.sortedWith( compareBy( { it != 4 }, { it } ) ) Profundizando en las fuentes, tenemos un Comparator para dos valores a y b construidos: Comparator { a, b -> compareValuesByImpl(a, b, selectors) }
y finalmente:
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 } El último fragmento de código demuestra que si todos los selectores tienen el mismo diff , a y b se consideran iguales; de lo contrario, el primer selector con diff != 0 decide.
Los booleanos son comparables. Al comparar 4 con cualquier otro valor, digamos 2, tendrás:
4 != 4 false 2 != 4 true diff = false.compareTo( true ) == -1y así, para ordenar, 4 es "menos" que cualquier valor que no sea 4