2
respostas

[Dúvida] Imprimindo Stream<String>

List<Curso> cursos = new ArrayList<Curso>();
cursos.add(new Curso("Python", 45));
cursos.add(new Curso("JavaScript", 150));
cursos.add(new Curso("Java 8", 113));
cursos.add(new Curso("C", 55));

Se ao imprimir:

System.out.println(cursos);

Não tendo o toString na classe, a saída será:

[Curso@41629346, Curso@404b9385, Curso@6d311334, Curso@682a0b20]

Mas ao sobrescrever o método toString na classe, conseguimos ter o resultado desejado conforme o que foi sobrescrito no método toString.

Não tem como de alguma forma conseguirmos imprimir a referencia de stream de uma coleção de cursos sem ser iterando sobre?

Stream<String> nomes = cursos.stream().map(Curso::getNome);
System.out.println(nomes);

Saída no terminal:

java.util.stream.ReferencePipeline$3@7ba4f24f
2 respostas

Não sei se entendi bem a sua dúvida, mas segue um exemplo que fiz que talvez possa ajudar:

import java.util.*;
import java.util.stream.Collectors;

class Main {

  public static void main(String[] args) {
    List<String> nomes = new ArrayList<>();
    nomes.add("Rachmaninoff");
    nomes.add("Beethoven");
    nomes.add("Chopin");
    nomes.add("Bach");

    List<Integer> listaDeTamanhos = nomes.stream().map(String::length).collect(Collectors.toList());
    System.out.println(listaDeTamanhos);

    nomes.stream().map(String::length).forEach(System.out::println);

  }
}

Output:

[12, 9, 6, 4]
12
9
6
4

Opa, creio que tu entendeu a minha dúvida pois fez o que eu não consegui fazer que era imprimir sem ter de fazer um forEach:

List<Integer> listaDeTamanhos = nomes.stream().map(String::length).collect(Collectors.toList());
System.out.println(listaDeTamanhos);

Seguindo o meu código se eu fizer isto não compila:

Stream<String> nomes = cursos.stream().map(Curso::getNome).collect(Collectors.toList());

o erro retornado:

Incompatible types. Found: 'java.util.List<java.lang.String>', required: 'java.util.stream.Stream<java.lang.String>'

e isto compila:

List<String> nomes = cursos.stream().map(Curso::getNome).collect(Collectors.toList());

O exemplo acima que não compila, é por que toList() retorna qualquer implementação do List interface e ao tentar atribuir isto a uma variavel do tipo Stream ocorre a incompatibilidade, seria isso?