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
Libérer: 2024-12-13 12:24:11
original
891 Les gens l'ont consulté

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
        }
    );
}
Copier après la connexion

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

Stream<String> input = ... ;
List<String> result = input.collect(maxList(comparing(String::length)));
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal