Maison >Java >javaDidacticiel >Comment puis-je récupérer toutes les valeurs maximales d'un flux Java, en gérant efficacement les liens ?
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.
Pour les collections d'entrées, une approche en deux passes peut être utilisée :
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.
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.
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!