Лямбда-выражения в Kotlin: урок в Android Studio

Лямбда-выражения — одна из самых выразительных возможностей Kotlin, которая встречается буквально в каждой строчке современного Android-кода. В этом уроке из цикла Android Studio: уроки на Kotlin вы перейдёте от теории к практике: поймёте, чем лямбда отличается от анонимного класса, освоите синтаксис и научитесь применять функции высшего порядка в реальных сценариях.


Зачем нужны лямбда-выражения

Представьте, что вам нужно передать кусочек поведения в метод — например, реакцию на клик кнопки. В Java для этого создают анонимный класс с одним методом, что загромождает код. Kotlin предлагает лямбду: короткий блок, который можно передать как значение. Это делает код чище, позволяет писать декларативные цепочки обработки данных и широко используется в Jetpack Compose, Room, Retrofit и других библиотеках.


Сравнение анонимного класса и лямбды

Чтобы оценить разницу, посмотрим на одну и ту же задачу в двух стилях: установка слушателя клика для кнопки.

Подход Код
Анонимный класс (Java) button.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    doSomething();
  }
});
Лямбда (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-разработчика прошлого десятилетия.