Kotlin Academy · Aula

Encadeando pipelines e evitando listas intermediárias com Sequence

Crie pipelines de várias etapas e use Sequence para avaliação preguiçosa.

Aula 4 de 413 etapas

Encadeando pipelines e evitando listas intermediárias com Sequence é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.

O problema: listas intermediárias

Cada operação de coleção (filter, map etc.) cria uma nova lista. Em coleções grandes ou cadeias longas, isso desperdiça memória e tempo.

Avaliação imediata versus tardia

As operações de coleção são imediatas: cada etapa processa completamente a lista antes da próxima. As operações de Sequence são tardias: processam um elemento por todas as etapas antes de passar ao próximo.

Conversão para Sequence

Chame asSequence() para mudar do processamento imediato (lista) para o processamento tardio (sequência).
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 é tardia: nenhum trabalho antes da operação terminal

Nenhum cálculo acontece até que você chame um 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: sequências infinitas

generateSequence cria sequências infinitas e tardias.
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]

Construtor sequence

O construtor sequence { } com yield cria sequências personalizadas e tardias.
val evens = sequence {
    var n = 0
    while (true) {
        yield(n)
        n += 2
    }
}
println(evens.take(5).toList())  // [0, 2, 4, 6, 8]

Quando usar Sequence

Use Sequence quando: a coleção for grande (mais de 1000 elementos), você usar várias operações encadeadas e/ou precisar apenas de um pequeno subconjunto dos resultados.

Quando NÃO usar Sequence

Em coleções pequenas (menos de 100 elementos), as sequências adicionam sobrecarga. O mecanismo baseado em iterador é mais lento para cadeias curtas.
// Overkill for small list:
listOf(1, 2, 3).asSequence().map { it * 2 }.toList()
// Just use:
listOf(1, 2, 3).map { it * 2 }

Operações terminais de Sequence

As operações terminais iniciam o processamento. Algumas comuns são: toList(), first(), last(), count(), sum(), any(), all(), none().
val s = (1..100).asSequence().filter { it % 7 == 0 }
println(s.first())          // 7
println(s.count())          // 14
println(s.sum())            // 728

Operações com estado versus sem estado

Algumas operações de sequência têm estado (sort, distinct) — elas precisam ver todos os elementos antes de produzir a saída. Essas operações interrompem a avaliação tardia.
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: segurança de iteração única

Use constrainOnce() para fazer com que uma sequência lance uma exceção se for iterada várias vezes — útil para fluxos de dados.
val seq = generateSequence(1) { if (it < 5) it + 1 else null }
    .constrainOnce()
val first = seq.toList()   // OK
// val second = seq.toList()  // IllegalStateException!

Verificação rápida

Quando uma Sequence começa a processar os elementos?

Recapitulação

As sequências são tardias — nenhum trabalho é realizado até uma operação terminal. Use asSequence() para coleções grandes com várias operações encadeadas. generateSequence e sequence { } criam fluxos infinitos e tardios. As operações terminais iniciam o processamento.
Grátis para começar

Aprenda Kotlin com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
51
Aulas
203

Perguntas Frequentes

A aula “Encadeando pipelines e evitando listas intermediárias com Sequence” é grátis?

Sim — o texto completo de “Encadeando pipelines e evitando listas intermediárias com Sequence” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.

O que vou aprender em “Encadeando pipelines e evitando listas intermediárias com Sequence”?

Crie pipelines de várias etapas e use Sequence para avaliação preguiçosa. Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Kotlin Academy?

Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Encadeando pipelines e evitando listas intermediárias com Sequence”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Kotlin Academy?

Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. map e flatMap: transformando cada elemento
  2. filter, filterNot e partition
  3. fold, reduce e runningFold
  4. Encadeando pipelines e evitando listas intermediárias com Sequence
← Voltar para Kotlin Academy