tutorial sintaxis kotlin

sintaxis - kotlin vs java



Concatenación de secuencias de Kotlin (1)

Su código no copia los elementos de secuencia, y sequenceOf(seq1, seq2).flatten() realmente hace lo que desea: genera una secuencia que toma elementos primero de seq1 y luego, cuando seq1 termina, de seq2 .

Además, operator + se implementa exactamente de esta manera, por lo que puede usarlo:

(seq1 + seq2).forEach { ... }

La fuente del operador es la esperada:

public operator fun <T> Sequence<T>.plus(elements: Sequence<T>): Sequence<T> { return sequenceOf(this, elements).flatten() }

Puede echar un vistazo a la implementación de .flatten() en stdlib que usa FlatteningSequence , que en realidad cambia los iteradores de las secuencias originales. La implementación puede cambiar con el tiempo, pero Sequence pretende ser lo más vago posible, por lo que puede esperar que se comporte de una manera similar.

Ejemplo:

val a = generateSequence(0) { it + 1 } val b = sequenceOf(1, 2, 3) (a + b).take(3).forEach { println(it) }

Aquí, copiar la primera secuencia nunca puede tener éxito ya que es infinito, e iterar sobre (a + b) toma elementos uno por uno de a .

Sin embargo, .flatten() que .flatten() se implementa de una manera diferente para Iterable , y copia los elementos. Encuentre más información sobre las diferencias entre Iterable y Sequence here .

val seq1 = sequenceOf(1, 2, 3) val seq2 = sequenceOf(5, 6, 7) sequenceOf(seq1, seq2).flatten().forEach { ... }

Así es como hago la concatenación de secuencias, pero me preocupa que en realidad esté copiando elementos, mientras que todo lo que necesito es un iterador que use elementos de los iterables (seq1, seq2) que le di.

¿Existe tal función?