Публикация

Kotlin. Функция apply()

Работая над очередной слоем бизнес-логики мы так или иначе проводим манипуляции с нашими дата объектами и используя функцию apply это можно сделать красивей.

Что такое Scope Function?

Scope Function - это не что иное, как функции, которые вызывается в области видимости нашего объекта.

Например, если вы работали с Extension Function, то scope функции по своей сути реализованы по такому же подходу и представлены как функции нашего объекта.

Как устроена функция apply?

Прежде рассмотрим как реализована функция apply:

/**
 * Calls the specified function [block] with `this` value
 * as its receiver and returns `this` value.
 */
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

Как и другие функции из серии эта функция также принимает в качестве параметра лямбда выражение и применяет contract {} для неё.

Тип возвращаемого значения функции apply - тот же вызывающий объект.

Когда использовать?

Переходим к примеру использования.

data class UserAccount(
  var username: String? = null,
  val email: String
) {
  fun showUsername() { println(username) }
}

На основе этого класса будет продемонстрирован пример ниже. Давайте представим, что у нас есть задача указать username на основе email мы бы могли сделать это так:

val user = UserAccount(email = "user@bcode.dev")
user.username = user.email.substring(0, user.email.indexOf('@'))
user.showUsername()

Или же воспользоваться функцией apply:

UserAccount(email = "user@bcode.dev").apply {
  this.username = this.email.substring(0, this.email.indexOf('@'))
}.showUsername()

Тут важный момент, что доступ к содержимому нашего дата класса внутри функции apply мы получаем используя this.

Подводя краткий итог функция apply позволяет вам выполнить какие-то манипуляции с нашим объектом в его же скоупе, что делает читабельность и понимание кода более приятным.

Опубликовано: 16 июля 2021 г.Просмотров: 62

Комментарии

Мы не даем слово анониму 😶
Войдите, пожалуйста.

Еще никто не комментировал эту публикацию 🤔