Лямбда-выражения — одна из самых выразительных возможностей Kotlin, которая встречается буквально в каждой строчке современного Android-кода. В этом уроке из цикла Android Studio: уроки на Kotlin вы перейдёте от теории к практике: поймёте, чем лямбда отличается от анонимного класса, освоите синтаксис и научитесь применять функции высшего порядка в реальных сценариях.
Зачем нужны лямбда-выражения
Представьте, что вам нужно передать кусочек поведения в метод — например, реакцию на клик кнопки. В Java для этого создают анонимный класс с одним методом, что загромождает код. Kotlin предлагает лямбду: короткий блок, который можно передать как значение. Это делает код чище, позволяет писать декларативные цепочки обработки данных и широко используется в Jetpack Compose, Room, Retrofit и других библиотеках.
Сравнение анонимного класса и лямбды
Чтобы оценить разницу, посмотрим на одну и ту же задачу в двух стилях: установка слушателя клика для кнопки.
| Подход | Код |
|---|---|
| Анонимный класс (Java) | button.setOnClickListener(new View.OnClickListener() { |
| Лямбда (Kotlin) | button.setOnClickListener { doSomething() } |
Лямбда заняла одну строку вместо семи. Это не магия — компилятор Kotlin сам создаёт анонимный класс за кулисами, когда лямбда передаётся в интерфейс с единственным абстрактным методом (SAM).
Синтаксис лямбда-выражений
Базовая структура выглядит так: фигурные скобки, внутри идёт список параметров (через запятую, без скобок), затем стрелка ->, затем тело. Если параметр один, его можно заменить на it и опустить объявление. Вот основные формы:
- Полная форма:
val sum = { a: Int, b: Int -> a + b } - С одним параметром:
val double = { x: Int -> x * 2 }или корочеval double: (Int) -> Int = { it * 2 } - Без параметров:
val greet = { println("Привет") } - Последний аргумент — лямбда: если функция принимает лямбду последним параметром, её можно вынести за скобки вызова, как в примере с кликом.
Функции высшего порядка: создаём свои
Функция высшего порядка — это функция, которая либо принимает другую функцию как параметр, либо возвращает функцию. Kotlin позволяет описывать тип функции в виде (Int, Int) -> Int. Напишем простой пример: метод, который выполняет переданную операцию над двумя числами.
fun operate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}
val result = operate(10, 5) { x, y -> x + y } // 15
В Android-разработке этот паттерн используют, чтобы отделить бизнес-логику от UI: ViewModel может принимать стратегию сохранения данных, а Activity передавать колбэк навигации.
Практический пример: обработка кликов и фильтрация
Создадим фрагмент кода в Android Studio. Допустим, у нас есть список строк, и мы хотим отфильтровать те, которые начинаются с большой буквы, затем преобразовать в верхний регистр и вывести в лог. Вся цепочка строится на лямбдах:
val fruits = listOf("яблоко", "Банан", "Апельсин", "виноград")
fruits.filter { it.first().isUpperCase() }
.map { it.uppercase() }
.forEach { Log.d("FRUIT", it) }
Здесь filter принимает лямбду-предикат, map — лямбду преобразования, forEach — лямбду действия. Такой код легко читать как цепочку операций, и он не требует циклов или временных переменных.
Лямбды и Jetpack Compose
В Compose лямбды стали основой объявления интерфейса. У каждого компонента есть свои callback-параметры, которые вы заполняете лямбдами. Например, кнопка с обработчиком:
Button(onClick = { viewModel.refresh() }) {
Text("Обновить")
}
А если нужно передать состояние из компонента родителю, используют лямбду с параметром:
@Composable
fun Counter(onCountChange: (Int) -> Unit) {
var count by remember { mutableStateOf(0) }
Button(onClick = { count++; onCountChange(count) }) {
Text("Счётчик: $count")
}
}
Именно лямбды дают Compose ту декларативность, за которую его любят. Поэтому Android Studio: уроки на Kotlin не могут обойти эту тему стороной — без понимания лямбд невозможно писать современный UI.
Практическое задание
Откройте Android Studio и создайте проект с Empty Activity. Внутри setContent добавьте простой экран с TextField и кнопкой. При нажатии кнопки текст из поля должен проверяться на пустоту с помощью лямбды let и выводиться в Snackbar. Напишите собственноручно функцию высшего порядка, которая принимает строку и лямбду-действие. Это закрепит понимание лучше любого чтения.
Итоги
Сегодняшний урок из цикла Android Studio: уроки на Kotlin дал вам инструмент, без которого современная разработка немыслима. Вы научились писать лямбда-выражения, заменять ими анонимные классы, создавать функции высшего порядка и применять их в связке с коллекциями и Compose. Лямбды — это ключ к лаконичному, выразительному и поддерживаемому коду, который отличает Kotlin-разработчика от Java-разработчика прошлого десятилетия.