Maison >Java >javaDidacticiel >Comment renvoyer toutes les valeurs maximales d'un flux Java à l'aide de la fonction « max » ?

Comment renvoyer toutes les valeurs maximales d'un flux Java à l'aide de la fonction « max » ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-13 12:24:11889parcourir

How to Return All Maximum Values from a Java Stream Using the `max` Function?

Renvoyer toutes les valeurs maximales à l'aide de la fonction Max dans les flux Java

Lors de l'utilisation de la fonction max dans les flux lambda de Java 8, des divergences peuvent apparaître dans les scénarios où plusieurs objets donnent la même valeur maximale. La fonction génère un représentant arbitraire sans évaluer ni prendre en compte tous les candidats viables.

Pour remédier à cette limitation, une méthode alternative est nécessaire pour récupérer toutes les valeurs maximales avec précision. Malheureusement, une approche simple n'est pas disponible, nécessitant l'utilisation d'une collection pour conserver des résultats partiels.

Solution en deux passes

Pour les entrées stockées dans une collection (Liste< String>), un processus en deux étapes peut être utilisé :

  1. Déterminer la longueur de la chaîne la plus longue (par exemple, int longest = list.stream().mapToInt(String::length).max().orElse(-1);).
  2. Filtrer la liste pour extraire toutes les chaînes avec la longueur maximale ( par exemple, List result = list.stream().filter(s -> s.length() == longest).collect(toList());).

Solution à passage unique (flux)

Pour aborder le scénario à passage unique avec des flux, un collecteur personnalisé peut être construit sur la base du comparateur fourni :

static <T> Collector<T, ?, List<T>> maxList(Comparator<? super T> comp) {
    return Collector.of(
        ArrayList::new,
        (list, t) -> {
            int c;
            if (list.isEmpty() || (c = comp.compare(t, list.get(0))) == 0) {
                list.add(t);
            } else if (c > 0) {
                list.clear();
                list.add(t);
            }
        },
        (list1, list2) -> {
            // Processing for list merging logic
        }
    );
}

Pour utiliser ce collecteur dans un flux, invoquez simplement collecter :

Stream<String> input = ... ;
List<String> result = input.collect(maxList(comparing(String::length)));

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn