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函数的最后一个参数,可以推断xy的数据类型。


取两个对象并且必须为它们定义一个整数是一个排序定义的抽象。 您基本上指定如果排序,这些元素将按什么顺序排列。

对于排序整数可能看起来像一个矫枉过正的,但考虑不得不排序更复杂的对象,例如类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 
Interesting Posts