Как уничтожить список Котлин в подсписках?

Как я могу уничтожить список в Котлине в двух подсписках? В настоящее время я делаю что-то вроде этого:

val (first, rest) = listOf("one", "two", "three") 

Но при этом сначала «один», а «два». Я хочу, чтобы они были first =["first"] и rest = ["two", "three"] .

Возможно ли это с использованием этого синтаксиса «деструктор»?

Destructuring переводит на вызывающие функции объекта component1 , component2 и т. Д. На объект. В случае List они определяются как расширения в стандартной библиотеке и возвращают N-й элемент соответственно.


Вы можете определить собственное расширение расширения, которое разбивает список по желанию и возвращает Pair , которая затем может быть разрушена:

 fun <T> List<T>.split() = Pair(take(1), drop(1)) 

Это можно использовать так:

 val (first, rest) = listOf("one", "two", "three").split() println(first) // [one] println(rest) // [two, three] 

Возможно, называть его чем-то лучше, чем split было бы разумно.

Вы также можете определить свои собственные компоненты:

 operator fun <T> List<T>.component2(): List<T> = this.drop(1) 

И тогда это работает так, как ожидалось:

 val (head, rest) = listOf("one", "two", "three") println(head) // "one" println(rest) // ["two", "three"] 

Это возможно, создав оператор component2 как метод расширения:

 operator fun <T> List<T>.component2(): List<T> = drop(1) fun destrcutList() { val (first: String, second: List<String>) = listOf("1", "2", "3") } 

Вам нужно создать метод расширения только для component2 , component1 будет использоваться как ранее.

Типы могут быть опущены:

 fun destrcutList() { val (first, second) = listOf("1", "2", "3") println(second[0]) // prints "2" } 

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

 import your.awesome.package.component2