So geben Sie mehrere Maximalwerte in einem Java-Stream zurück
In der Java Stream API gibt die Max-Funktion normalerweise eines der maximalen Elemente von zurück eine Sammlung, wenn sie mit einem Komparator versehen ist. Was aber, wenn wir alle Maximalwerte wünschen, insbesondere wenn mehrere Elemente denselben Maximalwert haben?
Trick zur Rückgabe aller Maximalwerte
Leider ist dies bei der Java-API der Fall bietet keine direkte Möglichkeit, alle Maximalwerte abzurufen. Eine Problemumgehung besteht jedoch darin, Teilergebnisse mithilfe eines Collectors zu speichern. Hier ist eine Hilfsfunktion, die einen Collector basierend auf einem Komparator generiert:
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) -> { if (list1.isEmpty()) { return list2; } if (list2.isEmpty()) { return list1; } int r = comp.compare(list1.get(0), list2.get(0)); if (r < 0) { return list2; } else if (r > 0) { return list1; } else { list1.addAll(list2); return list1; } }); }
Dieser Collector verwaltet eine Liste von Elementen, die im Hinblick auf den Komparator gleichwertig sind. Beim Zusammenführen von Ergebnissen gibt der Collector die Liste mit den größeren Elementen zurück. Wenn die Elemente gleich sind, werden die Listen angehängt.
Um diesen Collector auf einem Stream zu verwenden, wenden Sie ihn einfach wie folgt an:
Stream<String> input = ... ; List<String> result = input.collect(maxList(comparing(String::length)));
Beispielverwendung
Lassen Sie uns zum Beispiel alle Zeichenfolgen mit der maximalen Länge in einer Liste finden.
List<String> strings = Arrays.asList("apple", "banana", "pear", "orange", "grapes", "kiwi"); Stream<String> stringStream = strings.stream(); List<String> maxStrings = stringStream.collect(maxList(Comparator.comparingInt(String::length))); System.out.println(maxStrings); // [apple, banana, grapes, orange]
In diesem Beispielsweise gibt der maxList Collector eine Liste zurück, die alle Zeichenfolgen enthält, die die maximale Länge haben.
Das obige ist der detaillierte Inhalt vonWie erhalte ich alle Maximalwerte aus einem Java-Stream?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!