Geração de Stream com dados de arquivos:
Exemplo de como gerar um Stream com as linhas de arquivos em um diretório:
Stream
.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
.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
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
.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
.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
.collect(Collectors.toMap(
Usuario::getNome,
Function.identity()
));
Exemplo: NameToUser.java
Para entidades JPA, utilizando o id como chave:
Map
.collect(Collectors.toMap(
Usuario::getId,
Function.identity()
));
Exemplo: NameToUserJPA.java