Lições do módulo (2/2)
API de fluxo
A API Stream em Java permite processar coleções de objetos de maneira declarativa, aproveitando a programação funcional. Um Stream não armazena dados, mas carrega elementos de uma fonte (como uma lista ou array) por meio de um pipeline de operações.
Um pipeline Stream consiste em três partes:
- Uma fonte (por exemplo,
list.stream()) - Zero ou mais operações intermediárias (que retornam um novo Stream, por exemplo,
filter,map) - Uma operação de terminal (que produz um resultado final ou efeito colateral e fecha o Stream, por exemplo,
collect,forEach,reduce)
Operações intermediárias comuns
As operações intermediárias são preguiçosas: elas não são executadas até que uma operação de terminal seja invocada.
filter(Predicate): filtra elementos com base em uma condição booleana.map(Function): transforma cada elemento em outro objeto aplicando uma função.sorted(): ordena os elementos do Stream.
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("M"))
.map(name -> name.toUpperCase())
.collect(Collectors.toList()); // "MARCO"Operações de Terminal Comuns
forEach(Consumer): executa uma ação para cada elemento do Stream.collect(Collector): reúne os resultados do Stream em um contêiner (por exemplo, uma lista usandoCollectors.toList()).reduce(identity, BinaryOperator): combina os elementos Stream em um único valor cumulativo.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Sums all numbers: 10Experimente você mesmo
Complete o código usando o fluxo de números para filtrar apenas números pares, reúna-os em uma nova lista chamada pares e imprima-a usando System.out.println.
Mostrar dica
Comece chamando `numbers.stream()`, anexe `.filter(n -> n % 2 == 0)` e, finalmente, colete com `.collect(Collectors.toList())`.
Solução disponível após 3 tentativas
Use streams para transformar todos os nomes dentro da lista de nomes em letras maiúsculas usando map e imprima-os um por um usando forEach com uma referência de método.
Mostrar dica
Use `.map(s -> s.toUpperCase())` seguido pela operação de terminal `.forEach(System.out::println)`.
Solução disponível após 3 tentativas
Complete o código calculando a soma de todos os números na lista de números usando um Stream e a operação de terminal de redução com um valor inicial de 0. Imprima a soma.
Mostrar dica
Use `numbers.stream().reduce(0, (a, b) -> a + b)` e imprima a variável resultante.
Solução disponível após 3 tentativas