Maison >Java >javaDidacticiel >Comment puis-je récupérer toutes les valeurs maximales d'un flux Java, en gérant efficacement les liens ?

Comment puis-je récupérer toutes les valeurs maximales d'un flux Java, en gérant efficacement les liens ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-14 14:45:16501parcourir

How Can I Retrieve All Maximum Values from a Java Stream, Handling Ties Effectively?

Surmonter les limitations de Java Stream en renvoyant toutes les valeurs maximales

La fonction max de Stream identifie facilement la valeur maximale dans un flux. Cependant, il fonctionne selon le principe du « premier arrivé, premier servi », laissant potentiellement de côté d'autres valeurs maximales en cas d'égalité. Pour remédier à cette limitation et récupérer toutes les valeurs maximales, des approches alternatives sont nécessaires.

Solution en deux passes

Pour les collections d'entrées, une approche en deux passes peut être utilisée :

  1. Déterminez la valeur maximale en utilisant max sur des longueurs entières.
  2. Filtrez la collection pour obtenir toutes les chaînes avec le maximum longueur.

Cette solution prend en charge plusieurs valeurs maximales mais entraîne le coût d'une itération deux fois sur l'ensemble de l'entrée.

Collecteur à passage unique

Lorsque l'entrée est une flux, un collecteur à passage unique peut être utilisé :

static <T> Collector<T, ?, List<T>> maxList(Comparator<? super T> comp) {
    return Collector.of(
        ArrayList::new,
        (list, t) -> {
            if (list.isEmpty() || comp.compare(t, list.get(0)) == 0) {
                list.add(t);
            } else if (comp.compare(t, list.get(0)) > 0) {
                list.clear();
                list.add(t);
            }
        },
        (list1, list2) -> {
            ...
            // Compare and merge lists based on maximum values
        }
    );
}

Ce collecteur maintient l'invariant d'équivalence, en ajoutant ou en supprimant des éléments si nécessaire. Lors de la fusion de listes, il considère l'élément maximum de chacune et les combine lorsqu'ils sont égaux.

En combinant ce collecteur avec le flux, toutes les valeurs maximales peuvent être obtenues en un seul passage.

Conclusion

Bien que max dans les flux Java ait ses limites, des solutions alternatives peuvent être exploitées pour les surmonter. Une solution en deux passes est efficace pour les collections, tandis que le collecteur en un seul passage s'avère utile pour les flux, permettant de récupérer toutes les valeurs maximales.

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