Estoy tratando de utilizar corrientes de Java para recoge todos los String
s de la mayor longitud de mi lista:
List<String> strings = Arrays.asList("long word", "short", "long wwww", "llll wwww", "shr");
List<String> longest = strings.stream()
.sorted(Comparator.comparingInt(String::length).reversed())
.takeWhile(???)
.collect(Collectors.toList());
Me gustaría que mi longest
para contener {"long word", "long wwww", "llll wwww"}
, porque esas son las String
s que tienen las mayores longitudes. En caso de tener sólo uno de los String
s con mayor longitud, obviamente estoy esperando el resultado List
de contener solamente ese elemento.
Traté de primera clase a fin de tener la mayor longitud aparece en el primer elemento, pero no soy capaz de recuperar la longitud del primer elemento de la secuencia. Podría intentar algo como peek()
:
static class IntWrapper {
int value;
}
public static void main(String[] args) throws IOException {
List<String> strings = Arrays.asList("long word", "short", "long wwww", "llll wwww", "shr");
IntWrapper wrapper = new IntWrapper();
List<String> longest = strings.stream()
.sorted(Comparator.comparingInt(String::length).reversed())
.peek(s -> {
if (wrapper.value < s.length()) wrapper.value = s.length();
})
.takeWhile(s -> s.length() == wrapper.value)
.collect(Collectors.toList());
System.out.println(longest);
}
pero es ... fea ? No me gusta la introducción de envoltorio ficticia (gracias, efectivamente último requisito) o el peek()
truco .
¿Hay alguna forma más elegante para lograr esto?
Prueba esto:
List<String> strings = Arrays.asList("long word", "short", "long wwww", "llll wwww", "shr");
List<String> longest = strings.stream()
.collect(groupingBy(String::length, TreeMap::new, toList()))
.lastEntry()
.getValue();
System.out.println(longest);
Salida:
[long word, long wwww, llll wwww]