Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpBdLo 25 of 299 menu
◀ ▶

Лямбда вместо объекта в 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-лямбду при вызове фильтрации.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить