String output = names.stream()
.sorted((name1, name2) -> {
String() parts1 = name1.split(" ");
String lastName1 = parts1(parts1.length - 1);
String() parts2 = name2.split(" ");
String lastName2 = parts2(parts2.length - 1);
return lastName2.compareTo(lastName1);
})
.map(name -> {
String() parts = name.split(" ");
return parts(parts.length - 1);
})
.filter(lastName -> lastName.length() >= 5)
.reduce("", (accumulator, element) -> accumulator + element + ", ");
System.out.println("result: " + output);
Isso concatenará todas as strings, unidas por uma vírgula. (Teremos uma vírgula final que podemos retirar do final.)
reduce
nos dá uma visão interessante de uma área um pouco mais avançada de fluxos. Considere se você quisesse contar os caracteres da string e retornar um valor inteiro. Como você poderia fazer isso? O valor de retorno de reduce
gostaria de ser um inteiro, mas o accumulator
e element
args são strings. Vou deixar isso para um exercício, com essa questão do Stack Overflow como uma pista, e minha introdução aos coletores de fluxo Java como outra.
Reutilizando operações
Demos uma boa olhada na maneira como é usar e compor algumas das operações funcionais mais importantes do Java. Outra faceta importante é a reutilização de código. Digamos que você precisasse usar aquele classificador de strings sofisticado em vários lugares. Em Java, poderíamos criar uma interface funcional para compartilhar essa operação: