Kotlin Academy · Lección

Encadenar pipelines y evitar listas intermedias con Sequence

Construya pipelines de varios pasos y use Sequence para la evaluación diferida.

Lección 4 de 413 pasos

Encadenar pipelines y evitar listas intermedias con Sequence es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.

El problema: listas intermedias

Cada operación sobre una colección (filter, map, etc.) crea una lista nueva. En colecciones grandes o cadenas largas, esto desperdicia memoria y tiempo.

Evaluación inmediata frente a diferida

Las operaciones sobre colecciones son inmediatas: cada paso procesa completamente la lista antes de pasar al siguiente. Las operaciones sobre Sequence son diferidas: procesan un elemento a través de todos los pasos antes de pasar al siguiente.

Conversión a Sequence

Llame a asSequence() para cambiar del procesamiento inmediato (lista) al procesamiento diferido (secuencia).
val result = (1..1_000_000)
    .asSequence()
    .filter { it % 2 == 0 }
    .map { it * it }
    .take(5)
    .toList()
println(result)  // [4, 16, 36, 64, 100]

Sequence es diferida: no hay trabajo hasta la operación terminal

No se realiza ningún cálculo hasta que llama a un operador terminal (toList, first, sum, etc.).
val seq = generateSequence(1) { it + 1 }  // infinite!
    .filter { it % 3 == 0 }
    .map { it * it }
val first5 = seq.take(5).toList()
println(first5)  // [9, 36, 81, 144, 225]

generateSequence: secuencias infinitas

generateSequence crea secuencias infinitas y diferidas.
val fibonacci = generateSequence(Pair(0, 1)) { (a, b) -> Pair(b, a + b) }
    .map { it.first }
val first10 = fibonacci.take(10).toList()
println(first10)  // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

Constructor sequence

El constructor sequence { } con yield crea secuencias diferidas personalizadas.
val evens = sequence {
    var n = 0
    while (true) {
        yield(n)
        n += 2
    }
}
println(evens.take(5).toList())  // [0, 2, 4, 6, 8]

Cuándo utilizar Sequence

Utilice Sequence cuando la colección sea grande (más de 1000 elementos), utilice varias operaciones encadenadas o solo necesite un subconjunto pequeño de resultados.

Cuándo NO utilizar Sequence

En colecciones pequeñas (menos de 100 elementos), las secuencias añaden sobrecarga. El mecanismo basado en iteradores es más lento para cadenas cortas.
// Overkill for small list:
listOf(1, 2, 3).asSequence().map { it * 2 }.toList()
// Just use:
listOf(1, 2, 3).map { it * 2 }

Operaciones terminales de Sequence

Las operaciones terminales activan el procesamiento. Algunas habituales son: toList(), first(), last(), count(), sum(), any(), all() y none().
val s = (1..100).asSequence().filter { it % 7 == 0 }
println(s.first())          // 7
println(s.count())          // 14
println(s.sum())            // 728

Operaciones con estado frente a operaciones sin estado

Algunas operaciones de Sequence tienen estado (sort, distinct): deben ver todos los elementos antes de producir una salida. Interrumpen la evaluación diferida.
val s = (1..10).asSequence()
    .filter { it > 3 }   // stateless: lazy
    .sorted()            // stateful: must see all elements
    .take(3).toList()
println(s)  // [4, 5, 6]

constrainOnce: seguridad de una sola iteración

Utilice constrainOnce() para hacer que una secuencia produzca una excepción si se itera varias veces; resulta útil para streams.
val seq = generateSequence(1) { if (it < 5) it + 1 else null }
    .constrainOnce()
val first = seq.toList()   // OK
// val second = seq.toList()  // IllegalStateException!

Comprobación rápida

¿Cuándo empieza una Sequence a procesar los elementos?

Resumen

Las Sequence son diferidas: no se realiza ningún trabajo hasta una operación terminal. Utilice asSequence() para colecciones grandes con varias operaciones encadenadas. generateSequence y sequence { } crean streams infinitos y diferidos. Las operaciones terminales activan el procesamiento.
Gratis para empezar

Aprende Kotlin con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
51
Lecciones
203

Preguntas frecuentes

¿La lección «Encadenar pipelines y evitar listas intermedias con Sequence» es gratis?

Sí — el texto completo de «Encadenar pipelines y evitar listas intermedias con Sequence» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Encadenar pipelines y evitar listas intermedias con Sequence»?

Construya pipelines de varios pasos y use Sequence para la evaluación diferida. Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Kotlin Academy?

No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Encadenar pipelines y evitar listas intermedias con Sequence»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?

Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. map y flatMap: transformar cada elemento
  2. filter, filterNot y partition
  3. fold, reduce y runningFold
  4. Encadenar pipelines y evitar listas intermedias con Sequence
← Volver a Kotlin Academy