1
resposta

Filtrando Stream por palavras com um certo número de letras

Estava praticando sobre Streams e estava tentando filtrar um arquivo de texto por palavras com um certo tamanho utilizando somente labda etc. Segue o código:

package br.com.alura.streams.meuteste;

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class StreamTesteREVER {

    public static void main(String args[]) throws Exception {

        Stream<String> lyric = Files.lines(Paths.get("D:\\Alura\\Eclipse\\eclipse-workspace\\Java-8_New_Stuff\\src\\soLongFeatZada.txt"));

        lyric.map(line -> line.split(" "))
        .filter(filterbyLength -> filterbyLength.length > 5)
        .forEach(word -> System.out.println(word));

        lyric.close();
    }
}

O forEach retorna hashes.

Sem o ".map" o filter funciona mas como o lyric é uma linha, o filtro acaba tendo como base a contagem de toda a linha. Tentei aplicar a regra split e develver uma Stream de palavras individuais mas não achei um modo de resolver isso.

Se puderem dar uma olhada agradeço!

1 resposta

Vamos la, o .map() retorna uma nova lista de um novo objeto. Nesse caso, voce precisaria de uma lista para receber o filtro. precisa do filter. se voce colocar uma regra no proprio map voce ja retorna o filtro. depois do map voce precisa dizer que tem uma lista, chamando o .collect(Collectors.toList()). Acredito que assim de certo.

Outra coisa, quando voce usa um .split(), o retorno nao vai ser uma string, mas sim um array de strings. Se o seu objetivo é ler o arquivo e cada linha é uma palavra, voce nao precisa do split. Se voce quer apenas filtrar sem criar um novo objeto voce so precisa do filter. Lembrando que precis usar o collect e atribuir o que foi filtrado a uma variavel do tipo lista