¿Cómo puedo recoger sólo los elementos de la mayor longitud con corrientes de Java?

Fureeish:

Estoy tratando de utilizar corrientes de Java para recoge todos los Strings 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 longestpara contener {"long word", "long wwww", "llll wwww"}, porque esas son las Strings que tienen las mayores longitudes. En caso de tener sólo uno de los Strings con mayor longitud, obviamente estoy esperando el resultado Listde 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?

Ilya Lysenko:

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]

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=339113&siteId=1
Recomendado
Clasificación