Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

07 Coletando o resultado do stream em uma List

Como imprir isso? Tentei no exemplo abaixo mas não consegui;

List lista = filme.stream() .filter(c -> c.getValor() > 50) .collect(Collectors.toList());

lista.forEach((nome, valor) -> System.out.println(nome + " " + valor));

3 respostas

alguem, pode dar um help

Hey Bruno, beleza?

Para que o código funcione da forma esperada, exibindo os valores de cada atributo e não usando o método 'toString' da classe Filme para exibir o objeto completo (suponho que exista a classe Filme, contendo os atributos nome e valor correto?), será necessário coletar a lista filtrada transformando em um Map:

        List<Filme> filmesList = new ArrayList<>();
        filmesList.add(new Filme("O Senhor dos Anéis: A Sociedade do Anel", 60));
        filmesList.add(new Filme("Shazam", 45));
        filmesList.add(new Filme("Batman", 55));
        filmesList.add(new Filme("Beatle Juice", 35));

        Map<String, Double> lista = filmesList.stream()
                .filter(f -> f.getValor() > 50)
                .collect(Collectors.toMap(Filme::getNome, Filme::getValor));

        lista.forEach((nome, valor) -> System.out.println(nome + " " + valor));

Ou, extrair a ação de imprimir os atributos de forma apartada para outro método (não sei se seria uma abordagem correta):

    public static void main(String[] args) {

        List<Filme> filmesList = new ArrayList<>();
        filmesList.add(new Filme("O Senhor dos Anéis: A Sociedade do Anel", 60));
        filmesList.add(new Filme("Shazam", 45));
        filmesList.add(new Filme("Batman", 55));
        filmesList.add(new Filme("Beatle Juice", 35));

        List lista = filmesList.stream().filter(c -> c.getValor() > 50)
                .collect(Collectors.toList());

        lista.forEach(f -> imprimeFilme((Filme) f));

    }

    public static void imprimeFilme(Filme f) {
        System.out.println(f.getNome() + " " + f.getValor());
    }

Devido ao uso do generics, entendo que o .forEach recebe uma ação que não consegue acessar os métodos do Objeto que está recebendo, já que não consegue fazer o casting, pois não sabe de qual objeto se trata.

Espero ter ajudado...

Abs, ;)

solução!

Eu apostaria na segunda sugestão dada pela Gabriela, apesar de eu acreditar que, diferente do que ela disse, o método forEach saiba o tipo tratado na lista, já que no exemplo ela usou List para objetos Filme. Não testei, mas acredito que funcionaria como abaixo.

lista.forEach(f -> System.out.println(f.getNome() + " " + f.getValor() );