从Java比较器转换后的Kotlin比较器

时间:2019-06-26 15:56:14

标签: sorting kotlin comparator

我将Java文件转换为Kotlin。而且我修复了大多数问题。但是,我无法使用Comparator来理解这一部分。

wordItems.sortWith(Comparator { (_, word), (_, word) ->
    val size1 = word!!.length
    val size2 = word.length
    if (size1 < size2) {
        return@Collections.sort - 1
    } else if (size1 == size2) {
        return@Collections.sort 0
    } else {
        return@Collections.sort 1
    }
})

还有一个我也不明白。

Collections.sort(wordItems) { (_, word), (_, word) ->
    val size1 = word!!.length
    val size2 = word.length
    if (size1 < size2) {
        return@Collections.sort - 1
    } else if (size1 == size2) {
        return@Collections.sort 0
    } else {
        return@Collections.sort 1
    }
}

如何更改它以使其正常工作?

1 个答案:

答案 0 :(得分:2)

Comparator是Java中的SAM(单一抽象方法)接口。可以使用SAM转换技术在Kotlin中实例化此类接口的实现,因此无需编写实现Comparator的匿名对象,如下所示:

val comparator = object : Comparator<WordItem> {
    override fun compare(item1: WordItem, item2: WordItem): Int {
        val size1 = item1.word.length
        val size2 = item2.word.length
        ...
    }
}

你可以写

val comparator = Comparator<WordItem> { item1, item2 -> 
    val size1 = item1.word.length
    val size2 = item2.word.length
    ...
}

在这里,我假设每个WordItem都具有word属性。

似乎您正在按字长比较项目。在这种情况下,您可以使用compareBy函数进一步简化此类比较器:

wordItems.sortWith(compareBy { it.word.length })

sortBy函数

wordItems.sortBy { it.word.length }