Heim >Java >javaLernprogramm >Item Geben Sie Funktionen ohne Nebenwirkungen in Streams den Vorzug

Item Geben Sie Funktionen ohne Nebenwirkungen in Streams den Vorzug

WBOY
WBOYOriginal
2024-08-08 16:46:52712Durchsuche

Item  Dê preferência às funções sem efeitos colaterais nas streams

Einführung in die Verwendung von Streams:

  • Neuen Benutzern fällt es möglicherweise schwer, Berechnungen in Stream-Pipelines auszudrücken.
  • Streams basieren auf funktionaler Programmierung und bieten Ausdruckskraft, Geschwindigkeit und Parallelisierung.

Strukturierung der Berechnung:

  • Strukturberechnungen als Folgen von Transformationen unter Verwendung reiner Funktionen.
  • Reine Funktionen hängen nur von ihren Eingaben ab und ändern ihren Zustand nicht.

Nebenwirkungen:

  • Vermeiden Sie Nebenwirkungen in Funktionen, die an Stream-Vorgänge übergeben werden.
  • Unsachgemäße Verwendung von forEach, die den äußeren Zustand ändert, ist ein „schlechter Geruch“.

Beispiel 1: Code mit Nebenwirkungen

Map<String, Long> freq = new HashMap<>();
try (Stream<String> words = new Scanner(file).tokens()) {
    words.forEach(word -> {
        freq.merge(word.toLowerCase(), 1L, Long::sum);
    });
}

Problem: Dieser Code verwendet forEach, um den externen Status (freq) zu ändern. Es ist iterativ und nutzt keine Streams.

Beispiel 2: Code ohne Nebenwirkungen

Map<String, Long> freq;
try (Stream<String> words = new Scanner(file).tokens()) {
    freq = words.collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));
}

Lösung: Verwendet den Collectors.groupingBy-Kollektor, um die Häufigkeitstabelle zu erstellen, ohne den externen Status zu ändern. Kürzer, klarer und effizienter.

Aneignung der Streams-API:

  • Code, der iterative Schleifen imitiert, nutzt Streams nicht aus.
  • Verwenden Sie Collectors für effizientere und lesbarere Vorgänge.

Sammler:

  • Vereinfachen Sie das Sammeln von Ergebnissen in Sammlungen wie Listen und Sets.
  • Collectors.toList(), Collectors.toSet(), Collectors.toCollection(collectionFactory).

Beispiel 3: Extrahieren einer Liste der zehn häufigsten Wörter

List<String> topTen = freq.entrySet().stream()
    .sorted(Map.Entry.<String, Long>comparingByValue().reversed())
    .limit(10)
    .map(Map.Entry::getKey)
    .collect(Collectors.toList());

Erklärung:

  • Ordnet die Häufigkeitskarteneinträge in absteigender Reihenfolge nach Wert.
  • Begrenzt den Stream auf 10 Wörter.
  • Sammelt die häufigsten Wörter in einer Liste.

Komplexität der Collectors-API:

  • API verfügt über 39 Methoden, viele sind jedoch für den fortgeschrittenen Gebrauch gedacht.
  • Collectors können zum Erstellen von Karten (toMap, groupingBy) verwendet werden.

Karten und Sammelstrategien:

  • toMap(keyMapper, valueMapper) für eindeutige Schlüsselwerte.
  • Strategien zum Umgang mit Schlüsselkonflikten mithilfe der Zusammenführungsfunktion.
  • groupingBy, um Elemente basierend auf Klassifikatorfunktionen in Kategorien zu gruppieren.

Beispiel 4: Verwendung von toMap mit Merge-Funktion

Map<String, Long> freq;
try (Stream<String> words = new Scanner(file).tokens()) {
    freq = words.collect(Collectors.toMap(
        String::toLowerCase, 
        word -> 1L, 
        Long::sum
    ));
}

Erklärung:

  • toMap ordnet Wörter ihren Häufigkeiten zu.
  • Merge-Funktion (Long::sum) behandelt Schlüsselkonflikte durch Summieren der Häufigkeiten.

Beispiel 5: Alben nach Künstler gruppieren und das meistverkaufte Album finden

Map<Artist, Album> topAlbums = albums.stream()
    .collect(Collectors.toMap(
        Album::getArtist,
        Function.identity(),
        BinaryOperator.maxBy(Comparator.comparing(Album::sales))
    ));

Erklärung:

  • toMap ordnet Künstlern ihre meistverkauften Alben zu.
  • BinaryOperator.maxBy ermittelt das meistverkaufte Album für jeden Künstler.

String-Sammlung:
Collectors.joining zum Verketten von Zeichenfolgen mit optionalen Trennzeichen.

Beispiel 6: Zeichenfolgen mit Trennzeichen verketten

String result = Stream.of("came", "saw", "conquered")
    .collect(Collectors.joining(", ", "[", "]"));

Erklärung:

  • Collectors.joining verkettet Zeichenfolgen mit einem Komma als Trennzeichen, Präfix und Suffix.
  • Ergebnis: [kam, sah, siegte].

Fazit:

  • Das Wesen von Streams liegt in Funktionen ohne Nebenwirkungen.
  • forEach sollte nur zum Melden von Ergebnissen verwendet werden.
  • Kenntnisse über Sammler sind für die effektive Nutzung von Streams unerlässlich.

Das obige ist der detaillierte Inhalt vonItem Geben Sie Funktionen ohne Nebenwirkungen in Streams den Vorzug. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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