Cap 9.1 Coletores gerando mapas

Geração de Stream com dados de arquivos: Exemplo de como gerar um Stream com as linhas de arquivos em um diretório: Stream strings = Files.list(Paths.get("./br/com/casadocodigo/java8")) .filter(p -> p.toString().endsWith(".java")) .flatMap(p -> lines(p)); Exemplo: ListaArqDir .java Contagem de linhas de cada arquivo: Para contar as linhas de cada arquivo, usa-se mapToLong para contar o número de linhas de cada arquivo: LongStream lines = Files.list(Paths.get("./br/com/casadocodigo/java8")) .filter(p -> p.toString().endsWith(".java")) .mapToLong(p -> lines(p).count()); Exemplo: ListaNumLinhas.java Para gerar uma lista com os valores: List lines = Files.list(Paths.get("./br/com/casadocodigo/java8")) .filter(p -> p.toString().endsWith(".java")) .map(p -> lines(p).count()) .collect(Collectors.toList()); Exemplo: ListaValores.java Gerando um mapa com os arquivos e suas respectivas contagens de linhas: Exemplo de uso de forEach para popular um Map com o caminho do arquivo e a quantidade de linhas: Map linesPerFile = new HashMap(); Files.list(Paths.get("./br/com/casadocodigo/java8")) .filter(p -> p.toString().endsWith(".java")) .forEach(p -> linesPerFile.put(p, lines(p).count())); Observação: O uso de forEach pode gerar efeito colateral ao modificar uma variável externa. Quando você usa uma variável externa dentro de um lambda no forEach e a modifica, isso gera um efeito colateral. Exemplo: CaminhoLinhas.java Uso de toMap para criar um mapa de forma mais funcional: Usando o coletor toMap para evitar o efeito colateral do forEach: Map lines = Files.list(Paths.get("./br/com/casadocodigo/java8")) .filter(p -> p.toString().endsWith(".java")) .collect(Collectors.toMap( p -> p, p -> lines(p).count() )); Exemplo: CaminhoLinhasFuncional.java Criando um mapa de arquivos e seu conteúdo: Gerando um Map> com a lista de linhas de cada arquivo: Map content = Files.list(Paths.get("./br/com/casadocodigo/java8")) .filter(p -> p.toString().endsWith(".java")) .collect(Collectors.toMap( Function.identity(), p -> lines(p).collect(Collectors.toList()) )); Exemplo: ArquivoMap.java Exemplo de uso de toMap com usuários: Gerando um mapa com o nome do usuário como chave: Map nameToUser = usuarios.stream() .collect(Collectors.toMap( Usuario::getNome, Function.identity() )); Exemplo: NameToUser.java Para entidades JPA, utilizando o id como chave: Map nameToUser = usuarios.stream() .collect(Collectors.toMap( Usuario::getId, Function.identity() )); Exemplo: NameToUserJPA.java

Apr 1, 2025 - 02:54
 0
Cap 9.1 Coletores gerando mapas

Geração de Stream com dados de arquivos:

Exemplo de como gerar um Stream com as linhas de arquivos em um diretório:

Stream strings = Files.list(Paths.get("./br/com/casadocodigo/java8"))
.filter(p -> p.toString().endsWith(".java"))
.flatMap(p -> lines(p));

Exemplo: ListaArqDir .java

Contagem de linhas de cada arquivo:

Para contar as linhas de cada arquivo, usa-se mapToLong para contar o número de linhas de cada arquivo:

LongStream lines = Files.list(Paths.get("./br/com/casadocodigo/java8"))
.filter(p -> p.toString().endsWith(".java"))
.mapToLong(p -> lines(p).count());

Exemplo: ListaNumLinhas.java

Para gerar uma lista com os valores:

List lines = Files.list(Paths.get("./br/com/casadocodigo/java8"))
.filter(p -> p.toString().endsWith(".java"))
.map(p -> lines(p).count())
.collect(Collectors.toList());

Exemplo: ListaValores.java

Gerando um mapa com os arquivos e suas respectivas contagens de linhas:

Exemplo de uso de forEach para popular um Map com o caminho do arquivo e a quantidade de linhas:

Map linesPerFile = new HashMap<>();
Files.list(Paths.get("./br/com/casadocodigo/java8"))
.filter(p -> p.toString().endsWith(".java"))
.forEach(p -> linesPerFile.put(p, lines(p).count()));

Observação: O uso de forEach pode gerar efeito colateral ao modificar uma variável externa. Quando você usa uma variável externa dentro de um lambda no forEach e a modifica, isso gera um efeito colateral.

Exemplo: CaminhoLinhas.java

Uso de toMap para criar um mapa de forma mais funcional:

Usando o coletor toMap para evitar o efeito colateral do forEach:

Map lines = Files.list(Paths.get("./br/com/casadocodigo/java8"))
.filter(p -> p.toString().endsWith(".java"))
.collect(Collectors.toMap(
p -> p,
p -> lines(p).count()
));

Exemplo: CaminhoLinhasFuncional.java

Criando um mapa de arquivos e seu conteúdo:

Gerando um Map> com a lista de linhas de cada arquivo:

Map> content = Files.list(Paths.get("./br/com/casadocodigo/java8"))
.filter(p -> p.toString().endsWith(".java"))
.collect(Collectors.toMap(
Function.identity(),
p -> lines(p).collect(Collectors.toList())
));

Exemplo: ArquivoMap.java

Exemplo de uso de toMap com usuários:

Gerando um mapa com o nome do usuário como chave:

Map nameToUser = usuarios.stream()
.collect(Collectors.toMap(
Usuario::getNome,
Function.identity()
));

Exemplo: NameToUser.java

Para entidades JPA, utilizando o id como chave:

Map nameToUser = usuarios.stream()
.collect(Collectors.toMap(
Usuario::getId,
Function.identity()
));

Exemplo: NameToUserJPA.java