В чем разница между функциями run, let, also, apply

«В чем разница между функциями run, let, also, apply» — вопрос из категории Kotlin, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Функции-расширения Kotlin (run, let, also, apply) упрощают работу с объектами:

  1. let - принимает объект как it, возвращает результат лямбды.
    Используется для преобразования или проверки nullable-объектов:
    val length = nullableString?.let { it.length } ?: 0
  1. run - аналогично let, но без параметра (this вместо it).
    Можно использовать для инициализации:
    val result = service.run { 
        init()
        processRequest() 
    }
  1. apply - работает с this, возвращает сам объект.
    Для настройки свойств:
    val dialog = AlertDialog.Builder(context).apply {
        setTitle("Title")
        setMessage("Message")
    }.create()
  1. also - принимает объект как it, возвращает сам объект.
    Для side-эффектов:
    val file = File("path").also { 
        println("Created file: ${it.path}") 
    }

Ключевое отличие: let/run возвращают результат лямбды, apply/also возвращают контекстный объект. let/also используют it, run/apply - this.