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).