Как передать лямбду в toSortedSet() в Kotlin

Я немного запутался, почему это не работает. У меня простой Iterable из String что я хочу отсортировать через toSortedSet() мой собственный путь. Я хотел передать ему лямбду следующим образом:

myStringIterable.toSortedSet({a,b -> a.compareTo(b)}) 

Это, однако, не похоже на работу. Ошибка говорит

Несоответствие типов. Обязательный kotlin.Comparator

Найдено: (String,String) -> Int

Компаратор - это функциональный интерфейс, поэтому я должен быть в состоянии передать его как лямбду, не так ли?

3 ответа

Решение

Начиная с Kotlin 1.2, преобразование SAM поддерживается только для интерфейсов Java. kotlin.Comparator это интерфейс, определенный в Kotlin, и для таких интерфейсов не поддерживается преобразование лямбда-выражений в реализации этих интерфейсов.

Ты можешь использовать compareBy обернуть код в Comparator s:

toSortedSet(compareBy { it.length })

Я думаю, что в вашем случае аргумент не нужен для toSortedSet хоть.

Йоль уже предоставил почему, а вот как:

setOf("a", "b", "c").toSortedSet(object: Comparator<String>{
    override fun compare(s1: String, s2: String): Int {
        return s1.compareTo(s2) // replace with own logic
    }
}) 

Или вот так:

val comp = object: Comparator<String> {
    override fun compare(s1: String, s2: String): Int {
        return s2.compareTo(s1) // replace with own logic
    }
}

sortedSetOf(comp, "a", "b", "c")

Не уверен, что это ново, но вы можете:

val set = listOf("a", "c", "b").toSortedSet(Comparator { s1, s2 ->
    s1.compareTo(s2) // replace with own logic
})
Другие вопросы по тегам