Последовательность Котлина к массиву - PullRequest
1 голос
/ 28 апреля 2019

Как эффективно преобразовать Sequence в Array (или примитивный массив, такой как IntArray) в Kotlin?

Я обнаружил, что для Sequence нет методов toArray()s.И toList().toArray() (toList().toIntArray()) создает дополнительный временный список.

Ответы [ 2 ]

6 голосов
/ 28 апреля 2019

Нет методов toArray(), потому что, в отличие от списка, последовательность не позволяет выяснить, сколько элементов она содержит (и она может быть бесконечной), поэтому невозможно выделить массив правильного размера. .

Если вы знаете что-то о последовательности в вашем конкретном случае, вы можете написать более эффективную реализацию, выделив массив и скопировав элементы из последовательности в массив вручную. Например, если размер известен, можно использовать следующую функцию:

fun Sequence<Int>.toIntArray(size: Int): IntArray {
    val iter = iterator()
    return IntArray(size) { iter.next() }
}
0 голосов
/ 23 июня 2019

Я хотел бы добавить версию для Sequence<T>.Используя исправленный T (который требует, чтобы функция была встроенной), чтобы создать массив правильного типа, который не был бы возможен в Java: D

inline fun <reified T> Sequence<T>.toArray(size: Int): Array<T> {
  val iter = iterator()
  return Array(size) { iter.next() }
}
...