Лямбда вместо объекта в Kotlin
Если параметр имеет тип fun interface с одним
методом, компилятор Kotlin умеет превращать лямбду
в реализацию этого интерфейса. Такой прием называют
SAM-преобразованием.
Интерфейс задает сигнатуру проверки. Имя метода
может отличаться от invoke - важен только
список параметров и тип результата:
fun interface ScoreRule {
fun pass(points: Int): Boolean
}
Вместо object : ScoreRule достаточно передать
лямбду с тем же параметром. Тело лямбды станет
телом единственного метода интерфейса:
fun main() {
val rule: ScoreRule = ScoreRule { points ->
points >= 50
}
println(rule.pass(60))
println(rule.pass(40))
}
Лямбду можно сразу передать в функцию, которая ждет
ScoreRule. Снаружи остается короткая запись
условия без лишнего класса:
fun filterScores(
values: List<Int>,
rule: ScoreRule,
): List<Int> = values.filter { rule.pass(it) }
fun main() {
val data = listOf(30, 55, 70, 45)
val ok = filterScores(data, ScoreRule { it >= 50 })
println(ok)
}
Объявите fun interface LengthOk с
методом fits, который принимает
String и возвращает Boolean.
Передайте лямбду, где длина не больше 5,
и проверьте строки "kit" и "kotlin".
Есть список слов и правило LengthOk.
Верните новый список только из подходящих слов,
используя SAM-лямбду при вызове фильтрации.