Usar return no ForEach usando Stream

Pessoal, to com uma dǘvida aqui:

utilizando o Foreach no stream, eu tenho a opção de só retornar os resultados utilizando o return ao invés do System.out.print?

Exemplo (não deu desta forma):

public String listTopTen(){
    if (users.size() > 0) {
        Collections.sort(users);
        Stream<Person> topTen = users.stream().limit(10);
        **topTen.forEach(search -> return search.getName() + search.getNumberOfLoanBooks());**
    }

De acordo com a documentação, forEach não retorna nada. Ele só executa algo com os elementos e fim.

Se você quer retornar os valores em uma string, terá que montá-la manualmente. Algo assim:

public String listTopTen() {
    return users.stream().sorted().limit(10)
           // mapeia cada Person para uma string com os dados
           .map(p -> p.getName() + " " + p.getNumberOfLoanBooks())
           .collect(Collectors.joining("\n")); // junta tudo em uma única String
}

Não precisa testar se o tamanho da lista é maior que zero. Se ela estiver vazia, o stream também será vazio e o resultado será uma string vazia.

Repare que usei sorted para ordenar a stream. A diferença é que Collections.sort modifica a lista, enquanto sorted() só ordena a stream, mantendo a lista original sem modificação.

No map eu pego os dados da pessoa e transformo em uma string (coloquei um espaço entre as informações, mas você pode montar da maneira que quiser).

Depois eu junto tudo usando Collectors.joining, usando \n (quebra de linha) como o separador, assim cada pessoa fica em uma linha (mas você pode trocar para usar a string que quiser, como por exemplo ", " se quiser separar as pessoas por uma vírgula e espaço).


Outra alternativa é retornar uma lista de Person:

public List<Person> listTopTen() {
    return users.stream().sorted().limit(10).collect(Collectors.toList());
}

Assim você tem uma lista com os 10 primeiros, e pode fazer o que quiser com ela (imprimir o nome, montar uma string com os dados, etc). Me parece mais flexível assim, do que retornar uma String contendo dados específicos (mas claro que depende do que você precisa).

1 curtida

Muito obrigada! Fiz com base na segunda alternativa :smiley: