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

 
    
Top comments (0)