применять
Функция apply принимает цель и возвращает саму цель. Это позволяет вам выполнять некоторые операции с целью, сохраняя при этом исходную цель.
fun <T> T.apply(block: T.() -> Unit): T
T — это тип цели, а блок — это лямбда-выражение, которое выполняет некоторую операцию над целью. В этой лямбде вы можете использовать ключевое слово this для ссылки на текущую цель.
val person = Person().apply {
name = "John"
age = 30
address = "New York"
}
В этом примере мы создаем цель Person и устанавливаем характеристики цели в функции apply. В конечном итоге возвращается сама цель Person.
позволять
let также является функцией расширения, которая также получает лямбда-выражение в качестве параметра. В отличие от apply, в лямбда-выражении функция let принимает целевой получатель в качестве параметра лямбда-выражения и обычно использует его в качестве неявного имени. Возвращаемое значение функции let является результатом лямбда-выражения.
fun <T, R> T.let(block: (T) -> R): R
T — тип цели, R — тип возвращаемого значения, а блок — лямбда-выражение, которое выполняет некоторые операции с целью и возвращает результат.
val person = Person("Alice", 25)
val ageAfterFiveYears = person.let {
it.age + 5
}
В этом примере функция let используется для расчета возраста целевого объекта Person через пять лет.
также
также является функцией расширения, похожей на apply, но с одним ключевым отличием: возвращаемое значение функции также является самой целью-получателем, а параметром лямбда-выражения является цель-получатель, обычно используя его в качестве неявного имени.
fun <T> T.also(block: (T) -> Unit): T
T — это тип цели, а блок — это лямбда-выражение, которое выполняет некоторую операцию над целью. В этой лямбде вы можете использовать ключевое слово it для ссылки на текущую цель.
val person = Person("Alice", 25).also {
it.name = "Bob"
it.age = 30
}
В приведенном выше примере функция также используется для изменения характеристик класса Person, в конечном итоге возвращая измененную цель.
бегать
run — это функция расширения, сочетающая в себе функции apply и let. Функция запуска напрямую обращается к характеристикам и методам целевого объекта-получателя в лямбда-выражении и возвращает результаты лямбда-выражения.
fun <T, R> T.run(block: T.() -> R): R
T — тип цели, R — тип возвращаемого значения, а блок — лямбда-выражение, которое выполняет некоторые операции с целью и возвращает результат. В этой лямбде вы можете использовать ключевое слово this для ссылки на текущую цель.
val person = Person("Alice", 25)
val greeting = person.run {
"Hello, $name! You are $age years old."
}
В этом примере функция run используется для создания строки, содержащей целевую информацию о человеке.
Подведем итог
с
不怎么使用,因为它确实不防空; 经常使用的是
запустить和
применить
- Возвращаемый результат закрытия выполнения — это результат выполнения закрытия; возвращаемый результат применения — это сам вызывающий объект.
- Различия в использовании: run более склонен выполнять некоторые другие сложные логические операции, а apply больше касается настройки самого вызывающего объекта.
- В большинстве случаев, если я не настраиваю сам вызывающий объект, я использую run.