March 29, 2025

ikayaniaamirshahzad@gmail.com

8.6 Conhecendo mais métodos do Stream


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
    // ...
}

Enter fullscreen mode

Exit fullscreen mode

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());
}

Enter fullscreen mode

Exit fullscreen mode

🔹 Usando forEachRemaining do Iterator

usuarios.stream()
        .iterator()
        .forEachRemaining(System.out::println);

Enter fullscreen mode

Exit fullscreen mode

✅ 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);

Enter fullscreen mode

Exit fullscreen mode

🔹 Verificando se todos os usuários são moderadores (allMatch)

boolean allModerators = usuarios.stream()
                                .allMatch(Usuario::isModerador);

Enter fullscreen mode

Exit fullscreen mode

🔹 Verificando se nenhum usuário é moderador (noneMatch)

boolean noModerators = usuarios.stream()
                               .noneMatch(Usuario::isModerador);

Enter fullscreen mode

Exit fullscreen mode

✅ 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();

Enter fullscreen mode

Exit fullscreen mode

🔹 Pulando os n primeiros elementos (skip)

usuarios.stream()
        .skip(2)
        .forEach(System.out::println);

Enter fullscreen mode

Exit fullscreen mode

🔹 Limitando o Stream aos primeiros n elementos (limit)

usuarios.stream()
        .limit(3)
        .forEach(System.out::println);

Enter fullscreen mode

Exit fullscreen mode

5. Criando Streams Sem uma Coleção
🔹 Criando um Stream vazio

Stream vazio = Stream.empty();

Enter fullscreen mode

Exit fullscreen mode

🔹 Criando um Stream a partir de elementos específicos

Stream stream = Stream.of(user1, user2, user3);

Enter fullscreen mode

Exit fullscreen mode

🔹 Concatenando dois Streams

Stream concatenado = Stream.concat(stream1, stream2);

Enter fullscreen mode

Exit fullscreen mode

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);

Enter fullscreen mode

Exit fullscreen mode

🔹 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();
}

Enter fullscreen mode

Exit fullscreen mode

🔹 Criando um Stream a partir de um array

String[] linguagens = {"Java", "Python", "C++"};
Stream stream = Arrays.stream(linguagens);
stream.forEach(System.out::println);

Enter fullscreen mode

Exit fullscreen mode

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();
}

Enter fullscreen mode

Exit fullscreen mode

🔹 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();
}

Enter fullscreen mode

Exit fullscreen mode

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! 🚀



Source link

Leave a Comment