Java Stream API in 5 Minuten

Dieser Artikel richtet sich an Personen, die die Java Stream-API nicht lesen können.

Empfohlen für folgende Personen

Zunaechst

Die Java Stream-API hat nichts mit E / A-Klassen wie InputStream und OutputStream zu tun. Es ist ein Mechanismus, um ein Auflistungsobjekt wie List, Set oder ein schleifenfähiges Element wie ein Array nur einmal in der Schleife zu verarbeiten.

Die folgenden zwei Punkte werden häufig mit der Stream-API verwendet.

--Eine Entität konvertieren (Kartenmethode) --Filtersammlung (Filtermethode)

Hier ist der Java-Code.

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

public class StreamTest {
    public static void main(String[] args) {
        List<String> csvList = new ArrayList<>();
        csvList.add("Naoki Tanaka,MAN");
        csvList.add("Kazuki Kitamura,MAN");
        csvList.add("Shizuka Kato,WOMAN");
        csvList.add("Ono Schwester,UNKNOWN");
        // 1.Konvertieren Sie eine Entität.(map)
        List<Person> persons = csvList.stream().map(Person::convertPersonFromCSV).collect(Collectors.toList());

        // 2.Entitäten filtern.(filter)
        List<Person> mens = persons.stream().filter(p -> p.getGender() == Gender.MAN).collect(Collectors.toList());

        System.out.println("Print all persons");
        persons.forEach(System.out::println);

        System.out.println("Print mens only");
        mens.forEach(p -> System.out.println(p.getName()));
    }

    enum Gender {
        MAN,
        WOMAN,
        UNKNOWN;
    }

    static class Person {
        private String name;
        private Gender gender;

        public Person(String name, Gender gender) {
            this.name = name;
            this.gender = gender;
        }

        @Override
        public String toString() {
            return String.format("My name is %s . \r\nMy gender is %s.", name, gender);
        }

        public String getName() {
            return this.name;
        }

        public Gender getGender() {
            return this.gender;
        }

        public static Person convertPersonFromCSV(String csv) {
            String[] csvStrings = csv.split(",");
            if (csvStrings.length != 2) throw new IllegalArgumentException("csv is illegal format.");
            return new Person(csvStrings[0], Gender.valueOf(csvStrings[1]));
        }
    }
}

Schauen wir uns das oben in der Reihenfolge an

Konvertieren Sie eine Entität

Verwenden Sie die Kartenmethode, wenn Sie eine Entität konvertieren. Verwenden Sie die Map-Methode zum Konvertieren und die Collect-Methode, um Stream erneut in den Collection-Typ zu konvertieren. </ b>

Es gibt drei Hauptschreibweisen:

csvList.stream().map(Person::convertPersonFromCSV).collect(Collectors.toList());
csvList.stream().map(csv -> Person.convertPersonFromCSV(csv)).collect(Collectors.toList());
csvList.stream().map(csv -> {
                         Person person = Person.convertPersonFromCSV(csv);
                         return person;
                     }).collect(Collectors.toList());

Alles ist gleich, holen Sie sich den String, der ein Element von csvList ist. Ich führe eine Methode aus, die es in ein Personenobjekt konvertiert und zurückgibt.

--Das erste ist das Schreiben, indem das CSV-Argument weggelassen wird --Die zweite ist das Schreiben in einer Zeile, wobei die Rückgabemethode weggelassen wird ――Das dritte ist, wie man schreibt, ohne etwas auszulassen

Durch die Verwendung von Stream konnte ich List in List in einer Zeile (einem Liner) konvertieren. </ b> Einer der Vorteile der Verwendung von Stream besteht darin, dass Sie die Menge an Code, die Sie schreiben, reduzieren können.

Wenn Sie keine Zeit haben, überspringen Sie bitte Folgendes.

  • csvList.stream()
  • Holen Sie sich ein Stream-Objekt.
  • map(Person::convertPersonFromCSV) --String, die generische Schnittstelle von csvList, wird als Argument der Map-Methode angegeben.
  • Rufen Sie die Entitätskonvertierungsmethode der Person-Klasse auf, um die Entität zu konvertieren und die Entitätsklasse zurückzugeben.
  • Mit der Methode, die die Funktionsschnittstelle implementiert, wird die String-Klasse in die Person-Klasse konvertiert und zurückgegeben.
  • collect(Collectors.toList())
  • Sammle die konvertierten Personen.
  • Mit Collectors.toList () zur List-Klasse hinzufügen.
  • Sie können es auch mit Collectors.toXXX () in Set oder Map konvertieren. Im Fall von toMap müssen zwei Funktionen beschrieben werden, die Schlüssel und Wert zurückgeben.
  • Die Reihenfolge der Methodenverarbeitung ist ein Bild der Wiederholung des Prozesses "Konvertieren mit Karte und Speichern der mit Stream verarbeiteten Objekte mit Sammeln in der Liste".

Filtern Sie die Sammlung

Sie können ein neues Sammlungsobjekt erstellen, indem Sie bestimmte Elemente aus der Sammlung ausschließen. </ b> Verwenden Sie die Filtermethode, um das Zielobjekt zu beschreiben, das Sie behalten möchten.

persons.stream().filter(p -> p.getGender() == Gender.MAN).collect(Collectors.toList());

Mit Stream konnte ich eine neue Sammlung erstellen, in der nur Männer in einem Liner aus List extrahiert wurden. </ b>

  • filter(p -> p.getGender() == Gender.MAN)
  • Nehmen Sie Person als Argument und geben Sie einen Booleschen Wert zurück.

Andere Dinge, die Sie häufig mit der Stream-API tun

  • findAny
  • Ermitteln Sie in Kombination mit dem Filter, ob ein bestimmtes Element vorhanden ist.
  • sum
  • Berechnen Sie die Gesamtzahl der Sammlungen in Kombination mit mapToInt.
  • reduce
  • Kombinieren Sie die Elemente der Sammlung zu einem Objekt.

Recommended Posts