Kotlin对象表达式:比较例子
这段代码基本上按降序对数组进行排序:
val arrayList = arrayListOf(1, 5, 2) Collections.sort(arrayList, object : Comparator<Int> { override fun compare(x : Int, y: Int) = y - x })
如何在世界上压倒y - x
作品的比较方法? Kotlin如何知道y - x
意味着如果y < x
?
这实际上与Kotlin无关。 它与Java API的比较器接口有关,以及Collections.sort如何使用它。
从文档:
比较它的两个命令。 当第一个参数小于,等于或大于第二个参数时,返回负整数,零或正整数。
现在让我们来试试你给出的论点:
- 1 – 5 = -4(负整数),所以1小于5。
- 5 – 2 = 3(一个正整数),所以5大于2。
- 等等…
Collections.sort
不知道什么是y – x的意思。 它只是尊重Comparator接口的定义合同,任何实现者也需要尊重它(如果它想工作的话)。
恰巧y - x
是一个尊重该合约的实现,因为数学。
由于比较器是一个SAM接口,你可以使用lambda来更简洁地编写这段代码:
Collections.sort(arrayList, {x : Int, y: Int -> y - x})
甚至
Collections.sort(arrayList) { x, y -> y - x }
因为lambda是sort
函数的最后一个参数,可以推断x
和y
的数据类型。
取两个对象并且必须为它们定义一个整数是一个排序定义的抽象。 您基本上指定如果排序,这些元素将按什么顺序排列。
对于排序整数可能看起来像一个矫枉过正的,但考虑不得不排序更复杂的对象,例如类Car
实例。
这个类有一个colorCode
,你想按这个排序:
Collections.sort(cars) { car1, car2 -> car1.colorCode - car2.colorCode }
这就是你如何以抽象的方式定义这些对象的顺序。
在Kotlin中,您还可以使用kotlin集合扩展函数sort,sorted,sortBy ….等对元素进行排序
val arrayList = arrayListOf(1, 5, 2).sorted() //1,2,5
要么
val arrayList = arrayListOf(1, 5, 2).sortedDescending() //5,2,1