flatMap in Java

Mohammad Irfan 12 Oktober 2023
  1. Die flatMap-Funktion in Java
  2. Wie man die Methode flatMap() in Java verwendet
  3. Duplikate aus flatMap in Java entfernen
  4. Filterung von flatMap-Elementen in Java
  5. flatMap und primitiver Typ
  6. Fazit
flatMap in Java

Dieses Tutorial stellt flatMap und seine Verwendung in Java vor.

flatMap ist eine Operation/Funktion im Java-Stream, die verwendet wird, um einen neuen Stream zu erhalten, nachdem eine funktionale Aufgabe ausgeführt wurde. Hier werden wir über die Operation flatMap() sprechen.

Diese Operation ist eine Erweiterung der Operation map(). Diese Funktion wird auf jedes Stream-Element angewendet und generiert einen Stream mit neuen Werten.

Die generierten Elemente dieser neuen Streams werden dann in einen kürzlich erstellten Stream kopiert, der als Rückgabewert der Methode dient.

Die flatMap-Funktion in Java

Die Signatur der Funktion flatMap() lautet:

<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)

flatMap ist eine Zwischenoperation. Zwischenoperationen sind verzögerte Operationen und werden auf einer Stream-Instanz aufgerufen, und nachdem sie ihre Verarbeitung abgeschlossen haben, geben sie eine Stream-Instanz zurück.

Die Operation flatMap() ist eine Kombination aus der Operation map() und flat(). Das bedeutet, dass die Operation flatMap() zuerst die Operation map() anwendet und dann das Ergebnis glättet.

Diese Methode benötigt einen Mapper, eine Funktion, die auf jedes Element des eingehenden Stream anzuwenden ist.

Abflachung in Java

Lassen Sie uns zuerst verstehen, was Abflachung ist. Durch das Reduzieren einer Liste werden zwei oder mehr Ebenenlisten in eine einzige Ebenenliste konvertiert.

Ein Beispiel für eine zweistufige Liste ist:

[[ "I" ], [ "Love" ], [ "Delft", "Stack" ]]

Die obige Liste wird nach dem Abflachen umgewandelt in:

["I", "Love", "Delft", "Stack"]

Die erzeugte Liste ist eine einstufige Liste.

Notwendigkeit der Verflachung einer Liste

Es ist notwendig, eine Liste zu glätten, da der Umgang mit mehreren Stream-Ebenen schwierig, kompliziert und fehleranfällig sein kann.

Wir können die Operation Stream.flatMap() verwenden, um die beiden Stream-Ebenen in einen Stream mit einer einzigen Ebene umzuwandeln. Wir werden dies später in diesem Artikel anhand eines Beispiels verstehen.

Wie man die Methode flatMap() in Java verwendet

In diesem Beispiel haben wir zuerst einen Stream von Objekten aus einer Liste mit der Methode stream() erstellt. Jedes Objekt ist ein Programmierer in einem Unternehmen.

Wir werden zuerst eine Klasse erstellen, um einen Entwickler/Programmierer in einem Unternehmen darzustellen.

import java.util.HashSet;
import java.util.Set;
class Programmer {
  private String name;
  private Set<String> languages_known;

  public Programmer(String name) {
    this.name = name;
    this.languages_known = new HashSet<>();
  }

  public void addLanguage(String lang) {
    this.languages_known.add(lang);
  }

  public Set<String> getLanguages() {
    return languages_known;
  }
}

Wir werden nun Objekte initialisieren und eine Liste mit Listen erstellen, die alle Sprachen enthalten, die den Programmierern im gesamten Unternehmen bekannt sind. Wir werden diese Liste dann glätten, um alle Sprachen im Team zu beherrschen.

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String[] args) {
    Programmer raj = new Programmer("Raj");
    raj.addLanguage("Java");
    raj.addLanguage("Dart");
    raj.addLanguage("go");
    raj.addLanguage("groovy");

    Programmer karan = new Programmer("Karan");
    karan.addLanguage("Java");
    karan.addLanguage("Python");

    Programmer chahal = new Programmer("Chahal");
    chahal.addLanguage("Dart");
    chahal.addLanguage("Javascript");

    List<Programmer> team = new ArrayList<>();
    team.add(raj);
    team.add(karan);
    team.add(chahal);

    System.out.println("Programming languages in the team: ");
    List<String> languages = team.stream()
                                 .map(Programmer::getLanguages)
                                 .flatMap(Collection::stream)
                                 .collect(Collectors.toList());
    System.out.println(languages);
  }
}

Ausgabe:

Programming languages in the team: 
[Java, groovy, go, Dart, Java, Python, Javascript, Dart]

Im obigen Beispiel haben wir zuerst einen Stream aller Programmierer erstellt, die die Stream-API verwenden. Danach haben wir mit der Funktion map() einen Strom von Listen von Sprachen erstellt, die jedem Programmierer bekannt sind.

Duplikate aus flatMap in Java entfernen

Diese Liste glätten wir dann mit der Operation flatMap() und wandeln den resultierenden Stream in eine Liste um. Beachten Sie, dass die erzeugte Liste einige doppelte Werte hat; wir verwenden die Operation duplicate(), um diese zu eliminieren.

Sehen Sie sich den Code unten an.

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String[] args) {
    Programmer raj = new Programmer("Raj");
    raj.addLanguage("Java");
    raj.addLanguage("Dart");
    raj.addLanguage("go");
    raj.addLanguage("groovy");
    Programmer karan = new Programmer("Karan");
    karan.addLanguage("Java");
    karan.addLanguage("Python");
    Programmer chahal = new Programmer("Chahal");
    chahal.addLanguage("Dart");
    chahal.addLanguage("Javascript");
    List<Programmer> team = new ArrayList<>();
    team.add(raj);
    team.add(karan);
    team.add(chahal);
    System.out.println("Programming languages in the team: ");
    List<String> languages = team.stream()
                                 .map(Programmer::getLanguages)
                                 .flatMap(Collection::stream)
                                 .distinct()
                                 .collect(Collectors.toList());
    System.out.println(languages);
  }
}

Ausgabe:

Programming languages in the team: 
[Java, groovy, go, Dart, Python, Javascript]

Filterung von flatMap-Elementen in Java

Wenn wir alle Sprachen außer Dart haben wollen, können wir die Funktion filter() mit flatMap() verwenden. Sehen Sie sich den Code unten an.

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String[] args) {
    Programmer raj = new Programmer("Raj");
    raj.addLanguage("Java");
    raj.addLanguage("Dart");
    raj.addLanguage("go");
    raj.addLanguage("groovy");
    Programmer karan = new Programmer("Karan");
    karan.addLanguage("Java");
    karan.addLanguage("Python");
    Programmer chahal = new Programmer("Chahal");
    chahal.addLanguage("Dart");
    chahal.addLanguage("Javascript");
    List<Programmer> team = new ArrayList<>();
    team.add(raj);
    team.add(karan);
    team.add(chahal);
    System.out.println("Programming languages in the team: ");
    List<String> languages = team.stream()
                                 .map(Programmer::getLanguages)
                                 .flatMap(Collection::stream)
                                 .distinct()
                                 .filter(x -> !x.equals("Dart"))
                                 .collect(Collectors.toList());
    System.out.println(languages);
  }
}

Ausgabe:

Programming languages in the team:
[Java, groovy, go, Python, Javascript]

flatMap und primitiver Typ

Die Java Stream API bietet auch separate Operationen wie flatMapto{primitive type} für primitive Datentypen wie int, float, long, um den Stream des primitiven Typs zu glätten.

import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class SimpleTesting {
  public static void main(String[] args) {
    int[] Je_array = {3, 5, 2, 35, 85, 32, 23, 43, 12};
    Stream<int[]> JE_streamArray = Stream.of(Je_array);
    IntStream JE_intStream = JE_streamArray.flatMapToInt(x -> Arrays.stream(x));
    JE_intStream.forEach(x -> System.out.println(x));
  }
}

Ausgabe:

3
5
2
35
85
32
23
43
12

Fazit

Wir haben die Operation flatMap() besprochen und warum sie benötigt wird. Wir haben auch besprochen, wie die Java Stream API eine separate flatMap()-Operation für primitive Datentypen bereitstellt.

Beachten Sie, dass die normale flatMap()-Operation auch auf primitive Datentypen anwendbar ist.

Verwandter Artikel - Java Stream