„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Erweiterte Java-Stream-Tricks, die Sie kennen müssen

Erweiterte Java-Stream-Tricks, die Sie kennen müssen

Veröffentlicht am 18.11.2024
Durchsuche:969

dvanced Java Stream Tricks You Need to Know

1. Erstellen einer Karte zum Zwischenspeichern einer Entität

Das Zwischenspeichern von Entitäten in einer Karte kann die Leistung verbessern, indem die Notwendigkeit verringert wird, Daten wiederholt aus der Datenbank oder anderen Datenquellen abzurufen. Mit Java Streams können Sie einen solchen Cache ganz einfach erstellen.

Beispielcode

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class User {
    private int id;
    private String name;

    // Constructors, getters, setters
}

public class EntityCacheExample {
    public static void main(String[] args) {
        List users = List.of(
            new User(1, "Alice"),
            new User(2, "Bob"),
            new User(3, "Charlie")
        );

        Map userCache = users.stream()
            .collect(Collectors.toMap(User::getId, user -> user));

        System.out.println(userCache);
    }
}

Im obigen Code verwenden wir Collectors.toMap(), um eine Liste von Benutzerobjekten in eine Map zu konvertieren, wobei der Schlüssel die ID des Benutzers und der Wert das Benutzerobjekt selbst ist. Dadurch wird effektiv ein Cache mit Benutzerentitäten erstellt.

Demo-Ergebnis

{1=User{id=1, name='Alice'}, 2=User{id=2, name='Bob'}, 3=User{id=3, name='Charlie'}}

2. Erstellen einer verschachtelten Karte

Verschachtelte Karten können nützlich sein, wenn Sie Daten in mehrere Ebenen kategorisieren müssen. Beispielsweise möchten Sie möglicherweise Benutzer nach ihrer Abteilung und dann nach ihrer Rolle gruppieren.

Beispielcode

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class User {
    private String department;
    private String role;
    private String name;

    // Constructors, getters, setters
}

public class NestedMapExample {
    public static void main(String[] args) {
        List users = List.of(
            new User("HR", "Manager", "Alice"),
            new User("IT", "Developer", "Bob"),
            new User("IT", "Manager", "Charlie")
        );

        Map>> nestedMap = users.stream()
            .collect(Collectors.groupingBy(User::getDepartment,
                Collectors.groupingBy(User::getRole)));

        System.out.println(nestedMap);
    }
}

Dieser Code zeigt, wie man mit Collectors.groupingBy() eine verschachtelte Map erstellt. Die äußere Map gruppiert Benutzer nach Abteilung, während die innere Map sie weiter nach Rolle gruppiert.

Demo-Ergebnis

{HR={Manager=[User{name='Alice'}]}, IT={Developer=[User{name='Bob'}], Manager=[User{name='Charlie'}]}}

3. Erstellen einer Karte mit zwei Werten

Manchmal möchten Sie möglicherweise mehrere Attribute für einen einzelnen Schlüssel in einer Karte speichern. Verwenden einer Karte
>
kann eine effektive Lösung sein.

Beispielcode

import java.util.List;
import java.util.Map;
import java.util.AbstractMap.SimpleEntry;
import java.util.stream.Collectors;

class User {
    private int id;
    private String name;
    private int age;

    // Constructors, getters, setters
}

public class MapWithTwoValuesExample {
    public static void main(String[] args) {
        List users = List.of(
            new User(1, "Alice", 30),
            new User(2, "Bob", 25),
            new User(3, "Charlie", 35)
        );

        Map> userMap = users.stream()
            .collect(Collectors.toMap(User::getId, user -> 
                new SimpleEntry(user.getName(), user.getAge())));

        System.out.println(userMap);
    }
}

Hier verwenden wir SimpleEntry, um eine Karte mit zwei Werten – Name und Alter – zu erstellen, die jeder Benutzer-ID zugeordnet sind.

Demo-Ergebnis

{1=Alice=30, 2=Bob=25, 3=Charlie=35}

4. Gruppieren nach und Zuordnen

Das gemeinsame Gruppieren und Zuordnen kann komplexe Datentransformationen vereinfachen, z. B. das Konvertieren einer Liste von Objekten in eine gruppierte Karte, in der jede Gruppe bestimmte Attribute enthält.

Beispielcode

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class User {
    private String department;
    private String name;

    // Constructors, getters, setters
}

public class GroupingByMappingExample {
    public static void main(String[] args) {
        List users = List.of(
            new User("HR", "Alice"),
            new User("IT", "Bob"),
            new User("HR", "Charlie")
        );

        Map> groupedMap = users.stream()
            .collect(Collectors.groupingBy(User::getDepartment,
                Collectors.mapping(User::getName, Collectors.toList())));

        System.out.println(groupedMap);
    }
}

In diesem Beispiel gruppieren wir Benutzer nach Abteilung und ordnen dann die Objekte Benutzer ihren Namen zu und erstellen so eine Zuordnung, in der jede Abteilung einer Namensliste zugeordnet ist.

Demo-Ergebnis

{HR=[Alice, Charlie], IT=[Bob]}

5. Gruppieren nach, Zuordnen und Reduzieren

Durch die Kombination von Gruppierung, Zuordnung und Reduzierung können Sie Daten effizient aggregieren, z. B. Werte summieren oder den Maximalwert in jeder Gruppe ermitteln.

Beispielcode

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class Transaction {
    private String type;
    private int amount;

    // Constructors, getters, setters
}

public class GroupingByMappingReducingExample {
    public static void main(String[] args) {
        List transactions = List.of(
            new Transaction("Deposit", 100),
            new Transaction("Deposit", 200),
            new Transaction("Withdrawal", 50),
            new Transaction("Withdrawal", 30)
        );

        Map transactionSums = transactions.stream()
            .collect(Collectors.groupingBy(Transaction::getType,
                Collectors.reducing(0, Transaction::getAmount, Integer::sum)));

        System.out.println(transactionSums);
    }
}

In diesem Code gruppieren wir Transaktionen nach Typ, ordnen sie ihren Beträgen zu und reduzieren dann die Beträge durch Summieren. Das Ergebnis ist eine Karte, die den Gesamtbetrag für jede Transaktionsart anzeigt.

Demo-Ergebnis

{Deposit=300, Withdrawal=80}

6. Fazit

Diese fortgeschrittenen Java Stream-Tricks können Ihre Codierungseffizienz und Lesbarkeit erheblich verbessern. Wenn Sie diese Techniken beherrschen, können Sie komplexe Datenverarbeitungsaufgaben problemlos bewältigen. Wenn Sie Fragen haben oder weitere Erläuterungen benötigen, können Sie unten einen Kommentar abgeben!

Weitere Beiträge finden Sie unter: 5 fortgeschrittene Java-Stream-Tricks, die Sie kennen müssen

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/anh_trntun_4732cf3d299/5-advanced-java-stream-tricks-you-need-to-know-4i8h?1 Bei Verstößen wenden Sie sich bitte an [email protected] um es zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3