Создайте список из другого

Скажем, у меня есть некоторые значения в списке. Я хотел бы вернуть еще один список с новым элементом

fun newList():List<Int>{ val values =listOf<Int>(1,2,3,4,5,6); return 7::values; // something like that } 

В списках Kotlin есть избыточный оператор, перегруженный в kotlin-stdlib , поэтому вы можете добавить элемент в список:

 val values = listOf(1, 2, 3, 4, 5, 6) return values + 7 

Также есть перегрузка, которая добавляет другой список:

 val values = listOf(1, 2, 3, 4, 5, 6) return listOf(-1, 0) + values + listOf(7, 8) 

Обратите внимание, что в обоих случаях создается новый список, и элементы копируются в него.

Для MutableList<T> (который имеет мутирующие функции, в отличие от List<T> ), существует plusAssign оператора plusAssign , которая может использоваться следующим образом:

 fun newList(): List<Int> { val values = mutableListOf(1, 2, 3, 4, 5, 6) values += 7 values += listOf(8, 9) return values } 

Другой подход заключается в использовании оператора спредов. Возможно, в каком-то случае было бы проще, чем использовать знак + или mutableListOf

 fun newList(): List<Int>{ val values = listOf(1,2,3,4,5,6) return listOf(7, *values.toTypedArray(), 8, 9) } 

Вы можете сделать это так

 fun newList():List<Int>{ val values =listOf(1,2,3,4,5,6) //Type can be inferred return values.plus(7) } 

Я хотел, чтобы Scala-like и for yield . Это довольно хорошо – в настоящее время экспериментальные – сопрограммы:

 fun testYield(max:Int): List<Int> { val values = buildSequence{ for (i in 1..max){ yield(i) } } return values.toList(); } 

Или короче:

 fun testYieldFast(max: Int) = buildSequence { for (i in 1..max) yield(i) }.toList(); 

Это позволяет быстро неизменную ленивую конструкцию, где частые конкатенации обычно медленны с неизменными списками.