Найти в Дзене

Деструктурирующие объявления в Kotlin

1. Overview В этом руководстве мы познакомим вас с концепцией деструктурирования объявлений в Kotlin и рассмотрим, как ее можно использовать. 2. Деструктурирующие объявления Эта концепция состоит в рассмотрении объектов как набора отдельных переменных. 2.1. Объекты Разбиение объекта на несколько переменных может быть удобным: val person = Person(1, "Jon Snow", 20)
val(id, name, age) = person Таким образом, мы создали три новые переменные: println(id) //1
println(name) //Jon Snow
println(age) //20 Объявление деструктурирования компилируется в виде следующего кода: val id = person.component1();
val name = person.component2();
val age = person.component3(); Чтобы использовать объявление деструктурирования, нам нужно убедиться, что либо компонент помечен оператором, либо класс помечен ключевыми словами данных. 2.2. Типы возвращаемых данных Объявления деструктурирования также могут использоваться при работе с возвращаемыми значениями: fun getPersonInfo() = Person(2, "Ned Stark"
Оглавление

1. Overview

В этом руководстве мы познакомим вас с концепцией деструктурирования объявлений в Kotlin и рассмотрим, как ее можно использовать.

2. Деструктурирующие объявления

Эта концепция состоит в рассмотрении объектов как набора отдельных переменных.

2.1. Объекты

Разбиение объекта на несколько переменных может быть удобным:

val person = Person(1, "Jon Snow", 20)
val(id, name, age) = person

Таким образом, мы создали три новые переменные:

println(id) //1
println(name) //Jon Snow
println(age) //20

Объявление деструктурирования компилируется в виде следующего кода:

val id = person.component1();
val name = person.component2();
val age = person.component3();

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

2.2. Типы возвращаемых данных

Объявления деструктурирования также могут использоваться при работе с возвращаемыми значениями:

fun getPersonInfo() = Person(2, "Ned Stark", 45)
val(id, name, age) = getPersonInfo()

Или, допустим, нам нужно вернуть два значения из функции:

fun twoValuesReturn(): Pair<Int, String> {
// ...
return Pair(1, "success")
}

val (result, status) = twoValuesReturn()

2.3. Коллекции и циклы For-loops

Итерация коллекции с помощью for-циклов может быть выполнена с помощью объявлений деструктурирования, подобных этому:

for ((a, b) in collection) { ... }

Переменным a и b присваиваются значения, возвращаемые методами component1() и component2(), которые возвращают первые два элемента в коллекции.

Однако в Map переменными были бы key и value соответственно:

var map: HashMap<Int, Person> = HashMap()

map.put(1, person)

for((key, value) in map){
println("Key: $key, Value: $value")
}

2.4. Подчеркивание и деструктурирование в лямбдах

В случае, если нам не нужны все значения, полученные в объявлении деструктурирования, мы можем использовать подчеркивание вместо имени переменной:

val (_, name, age) = person

Или, если в конце находятся ненужные поля, мы можем вообще опустить их:

val (id, name) = person

Мы также можем использовать синтаксис деструктурирующих объявлений для лямбда-параметров, если это тип с соответствующими функциями componentN:

map.mapValues { entry -> "${entry.value}!" }
map.mapValues { (key, value) -> "$value!" }

Имейте в виду разницу между объявлением двух параметров и объявлением деструктурирующей пары:

{ a -> ... } // one parameter
{ a, b -> ... } // two parameters
{ (a, b) -> ... } // a destructured pair
{ (a, b), c -> ... } // a destructured pair and another parameter

3. Заключение

В этой краткой статье мы рассмотрели объявления о деструктурировании в Kotlin с его многочисленными способами использования и особенностями.

Оригинал статьи: https://www.baeldung.com/kotlin/destructuring-declarations