Nesta lição, vamos dar uma olhada no suporte de streaming na biblioteca Java.utility. Vamos dar uma olhada no pipelining, pontos terminais, filtragem, mapeamento, agrupamento reduzindo, ordenando estatísticas, e vamos terminar de olhar para permite. Nesta lição específica, vamos dar uma olhada no pipeline e nos endpoints do terminal. Então, se você pode ver o gráfico aqui, começamos com uma fonte de transmissão, que pode ser sobre qualquer coisa. Normalmente é um tipo de coleção, uma lista, um mapa, uma fila. Pode ser um array, um canal IO. Pode ser uma série de coisas. E pedimos a essa fonte de stream que se apresente como um fluxo usando o método stream. Nesse ponto, há qualquer número de operações intermediárias que podemos realizar no stream. Você pode ter ouvido o termo redução de mapa ou transformação de mapa. É essa ideia. Podemos filtrar, classificar, converter, mapear, muitas operações diferentes que consideramos essas operações intermediárias como sendo, podemos realizar neste fluxo. Agora, nada realmente acontece até chegarmos ao terminal de operação, que veremos poderia ser, gostaria da coleção agora para ser apresentado como uma coleção depois de ter sido transformado e reduzido e outros enfeites ou talvez apenas um agregado, uma contagem ou uma soma, ou estatísticas como veremos. Então, a primeira coisa que quero fazer, apenas para começar aqui com a ideia, Eu tenho uma coleção aqui que passa a ser uma lista de frutas. E você pode vê-los aqui. E o que poderíamos ter feito antes do Streams teria sido a abordagem imperativa. Podemos ter passado por cima da lista. E neste caso, estamos procurando por cada fruta que termina com a letra e. Então maçã, sim, laranjas, não, abacaxi, sim, e você pode ver. Então poderíamos dizer, se a fruta terminar com a letra e em seguida, adicione essa fruta específica à lista filtrada. E aí vamos nós. No final, devemos terminar com maçã, abacaxi., e, bem, havia duas maçãs aqui. Agora usando Streams, é um pouco mais declarativo. Então podemos começar com a mesma lista de frutas que tivemos há pouco. E neste caso, vamos pedir a coleção, neste caso, a lista, apresentar-se a nós como uma Corrente. Nesse ponto, podemos começar a disparar essas operações intermediárias. E aqui você pode ver que vou usar o método de filtro. Vou usar a expressão lambda aqui, tal que eu gostaria de filtrar o fluxo para incluir apenas as frutas que terminam com a letra e. E então o operador do terminal que você vê aqui é coletar tudo o que passou pelo filtro aqui, colete isso em uma lista. E estou recebendo-os em algo chamado FilterList. Então você pode ver que minha afirmação é a mesma de antes, exceto que eu não escrevi nenhum loop ou não fiz nenhum if ou criar quaisquer listas temporárias ou adicionar à lista temporária, Nada disso. Acabei de usar o suporte a stream e a programação declarativa. Então você pode ver que foi muito eficiente. Podemos lidar com qualquer tamanho de conjunto de elementos no fluxo, memória muito eficiente. Nada aconteceu até atingirmos o ponto final do terminal. E quero dar uma olhada em algumas outras ideias aqui, aquele em que eu tenho uma coleção que tem centenas de milhares de pontos, geolocalizações, nele. E eu gostaria de fazer algumas coisas. Parece que, primeiro, Vou ler todas as geolocalizações. Esse cara tem 30.406 elementos nele. O que eu gostaria de fazer agora é, com essa mesma coleção de pontos de geolocalização, é transformá-lo em um fluxo. Em outras palavras, peça-lhe que se apresente a mim como um riacho. E então eu vou emitir este operador intermediário de filtro. Vou filtrar apenas as geolocalizações onde a população era superior a 50.000 e, em seguida, recolhê-lo para uma lista. Então você pode ver aqui que as maiores populações, havia apenas 951 geolocalizações em 30.406 que tinha mais de 50.000 habitantes. Agora a próxima noção aqui embaixo, temos usado o .stream para transformar a arrecadação, neste caso, em um córrego. Se tivermos centenas de milhares ou milhões ou dezenas de milhões de elementos no fluxo, podemos facilmente usar a operação parallelStream. E o que isso faz é sair para ver quantos núcleos você tem, quantos processadores na máquina, e vai criar debaixo do tapete tantos threads quanto núcleos em sua plataforma. E então o que ele faz é bifurcar/juntar Ou algo nesse sentido de modo que ele possa sair e determinar quantas populações têm mais de 50.000 habitantes usando tantos threads quantos os núcleos da sua máquina. Portanto, permite cálculos paralelos muito fáceis sem ter que se preocupar com multi-threading e fazendo todas essas coisas nós mesmos. E a última coisa que vou te mostrar, Eu pensei que isso era interessante. Se você quiser dar uma espiada e ver como é em vários pontos ao longo de seu pipeline, eles nos deram um método de espiar. Agora, a única coisa que consigo entender sobre isso é que eles colocam isso aqui para os desenvolvedores. Vou filtrar meu fluxo de frutas aqui, aquelas frutas que terminam com a letra minúscula e e então o peek espera que você o passe como consumidor. Então, meu consumidor é, vou consumir os elementos que passaram por esta parte do filtro, através desta parte do pipeline e imprima-o. E então vou mapear qualquer fruta que tenha feito isso através desse filtro para o nome da fruta em maiúsculas. E você pode ver que podemos colocar essas operações peek lá em qualquer número de lugares ao longo da tubulação. E então, por fim, eu coloco em uma lista e você pode ver que o que eu deveria ter no resultado final é MAÇÃ, ABACAXI e MAÇÃ novamente em maiúsculas, porque foi filtrado e foi transformado ou mapeado para a versão maiúscula. Então eu aprecio você assistindo. Muito obrigado.