Sequencias preguiçosas

Sejam bem-vindos.

na aula de hoje falaremos um pouco mais sobre sequencias. porem num aspecto mais voltado ao processamento de sequencias. na aula de arrays vimos um pouco do poder quem um array ordenado tem. na aula de hoje veremos o poder de uma sequencia preguicosa.

mas antes de entrarmos no que é uma lazy sequencie vamos ver algumas operacoes comuns de processamentos de arrays

  • filtro/selecao
  • map
  • reduce
  • take

com filtro conseguimos selecionar items que atendem a uma determinada condiçãp. com map conseguimos transformar todos os itens de um array.

o que essas operações tem em comum é que o processamento é feito de maneira - traduzindo literalmente - ansiosa. Durante o map de um array todos os itens são processados, mesmo que você não esteja interessado em todos os itens.

Quando voce nao vai querer processar todos os itens de uma vez?

Geralmente quando apenas uma parte da informação é necessária. Digamos, por exemplo, que você tenha uma lista de 1000 pedidos, mas deseja obter apenas os 3 últimos pedidos que contêm um determinado item.

claro, um filtro dos mil itens pode ser feito e voce pode entao pegar os tres primeiros itens da lista filtrada mas isso é ineficiente e quando lidamos com estruturas de dados queremos fazer código eficiente.

assim, o que queremos é percorrer o array até que encontremos os tres itens que atendem à condição. usando um for loop você geralmente já atinge isso - hoje em dia, no entanto, ninguém quer mais usar for loop. os devs têm preferido usar construcoes funcionais - de linguagens nao funcionais - para processar arrays. esse estilo mais declarativo esconde a implementacao o que pode levar a esse codigo menos eficiente.

> SIDE: Contrucoes funcionais, a raiz do código ineficiente
>
> Voce faria um for loop em mil itens para encontrar os três que atenderam a um certo threshold? Não? Por que faz um filter então?
> TESE: As pessoas não precebem que fazem código ineficiente por não conhecerem as estruturas e suas operações.

Laxy evaluation

For loop é uma espécie de lazy evaluation. o processamento é feito item a item e quando a quantidade de itens necessários é compleada, encerra-se a operação.

Um jeito de fazer isso é com geradores que no JS realmente chamam Generators e no ruby chamam Enumerator. A ideia é encapsular um novo gerador a cada operação que for necessária.

No Ruby Enumerator::Lazy já toma conta disso. No JS, Iterators são utilizados.

Lidando com arquivos de forma preguiçosa