Heim > Java > javaLernprogramm > Wie erhalte ich alle Maximalwerte aus einem Java-Stream?

Wie erhalte ich alle Maximalwerte aus einem Java-Stream?

Linda Hamilton
Freigeben: 2024-12-08 13:33:11
Original
619 Leute haben es durchsucht

How to Get All Maximum Values from a Java Stream?

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;
            }
        });
}
Nach dem Login kopieren

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)));
Nach dem Login kopieren

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]
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage