Как передать лямбду в 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
})