1. Introdução aos Métodos do Stream
- O capítulo apresenta métodos adicionais da API Stream do Java 8.
- Nem todos os métodos são cobertos, mas são destacados os mais interessantes.
- Discutem-se boas práticas no uso de streams.
2. Trabalhando com Iterators
🔹 Stream não implementa Iterable
Se tentarmos percorrer um Stream usando um for-each, ocorre erro de compilação:
for (Usuario u : usuarios.stream()) { // Erro de compilação
// ...
}
Isso ocorre porque Stream não é reutilizável: após ser consumido, ele não pode ser usado novamente.
🔹 Utilizando um Iterator para percorrer um Stream
Iterator i = usuarios.stream().iterator();
while (i.hasNext()) {
System.out.println(i.next());
}
🔹 Usando forEachRemaining do Iterator
usuarios.stream()
.iterator()
.forEachRemaining(System.out::println);
✅ Quando usar Iterator?
- Quando precisamos modificar objetos dentro do Stream.
- Para compatibilidade com APIs que exigem Iterator.
3. Testando Predicates
🔹 Verificando se existe pelo menos um usuário moderador (anyMatch)
boolean hasModerator = usuarios.stream()
.anyMatch(Usuario::isModerador);
🔹 Verificando se todos os usuários são moderadores (allMatch)
boolean allModerators = usuarios.stream()
.allMatch(Usuario::isModerador);
🔹 Verificando se nenhum usuário é moderador (noneMatch)
boolean noModerators = usuarios.stream()
.noneMatch(Usuario::isModerador);
✅ O processamento para assim que encontra um elemento que atende ao critério!
4. Métodos Úteis do Stream
🔹 Contando quantos elementos há no Stream
long count = usuarios.stream().count();
🔹 Pulando os n primeiros elementos (skip)
usuarios.stream()
.skip(2)
.forEach(System.out::println);
🔹 Limitando o Stream aos primeiros n elementos (limit)
usuarios.stream()
.limit(3)
.forEach(System.out::println);
5. Criando Streams Sem uma Coleção
🔹 Criando um Stream vazio
Stream vazio = Stream.empty();
🔹 Criando um Stream a partir de elementos específicos
Stream stream = Stream.of(user1, user2, user3);
🔹 Concatenando dois Streams
Stream concatenado = Stream.concat(stream1, stream2);
6. Criando Streams a Partir de Outras Fontes
🔹 Usando regex para dividir uma String em Stream
Pattern pattern = Pattern.compile(",");
Stream stream = pattern.splitAsStream("Java,Python,C++");
stream.forEach(System.out::println);
🔹 Criando um Stream com as linhas de um arquivo
try (Stream linhas = Files.lines(Paths.get("arquivo.txt"))) {
linhas.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
🔹 Criando um Stream a partir de um array
String[] linguagens = {"Java", "Python", "C++"};
Stream stream = Arrays.stream(linguagens);
stream.forEach(System.out::println);
7. Streams e Recursos de I/O
🔹 Fechando um Stream manualmente com close()
Stream linhas = Files.lines(Paths.get("arquivo.txt"));
try {
linhas.forEach(System.out::println);
} finally {
linhas.close();
}
🔹 Usando try-with-resources para evitar vazamento de recursos
try (Stream linhas = Files.lines(Paths.get("arquivo.txt"))) {
linhas.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
8. Conclusão
- A API Stream oferece muitas funcionalidades.
- Sempre vale a pena explorar novos métodos para evitar implementações manuais.
- Se precisar de algo, é provável que a API Stream já tenha um método pronto! 🚀