Heutzutage Java Lambda Expressions und Stream API

Es ist lange her seit der Veröffentlichung von Java8, aber ich habe aus irgendeinem Grund Lambda-Ausdrücke und die Stream-API verwendet, daher werde ich es noch einmal zusammenfassen.

Lambda-Stil

Lambda-Ausdrücke sind eine einfache Möglichkeit, eine Schnittstelle mit nur einer Methode zu implementieren, die als funktionale Schnittstelle bezeichnet wird.

Funktionsschnittstelle

In einer funktionalen Sprache wie lisp oder einer Sprache wie C mit einem Funktionszeiger können Sie leicht eine "Funktion" übergeben, in Java können Sie sie jedoch nur übergeben, wenn die Funktion ein Objekt ist. Durch Vorbereiten einer Funktionsschnittstelle wie der folgenden ist es daher möglich, eine Funktion zu übergeben.

Func.java


package jp.foo;

public interface Func {
	public double apply(double x);
}

Eine funktionale Schnittstelle hat nur eine abstrakte Methode.

Implementierung der Funktionsschnittstelle

Bis java7 wurde die abstrakte Methode wie folgt überschrieben.

Func g = new Func(){
	@Override
	public double apply(double x) {
		return x * x;
	}
};

In Java8 kann die Beschreibung wie folgt vereinfacht werden, indem die Tatsache ausgenutzt wird, dass die Funktionsschnittstelle nur eine Methode hat. Dies ist der Lambda-Ausdruck.

Func f = x -> x * x;

Wenn Sie etwas enger schreiben

Func f = (x) -> {return x * x;};

Im Allgemeinen wird es beschrieben als "(Argument 1, Argument 2, ...) -> {Prozess 1; Prozess 2; ...}". Wenn es kein Argument oder keine Rückgabe gibt, können Sie es natürlich leer schreiben wie () -> {}. Dies überschreibt nur eine Methode der Funktionsschnittstelle. Die Funktionsschnittstelle vereinfacht die Beschreibung, indem sie die Tatsache ausnutzt, dass nur eine Methode überschrieben werden kann.

Dieser Lambda-Ausdruck ist beispielsweise nützlich, wenn eine Methode verwendet wird, die eine funktionale Schnittstelle als Argument verwendet (z. B. wie unten gezeigt).

FuncUser.java


package jp.foo;

public class FuncUser {
	public static void samplePrintFunc(Func f) {
		for(double x = 1.0; x <= 3.0; x += 1.0) {
			System.out.println(f.apply(x));
		}
	}
}

Die einfache Beschreibung lautet wie folgt.

FuncUser.samplePrintFunc(x -> x * x);
FuncUser.samplePrintFunc(x -> Math.sin(x));

Wenn der Prozess etwas kompliziert wird, können Sie mehrere Prozesse beschreiben, indem Sie sie in "{// mehrere Prozesse beschreiben}" einfügen.

FuncUser.samplePrintFunc(x -> { a = Math.sin(x); b = Math.cos(x); return a * b; });

Wenn es nur einen Prozess gibt und der Argumenttyp der Funktionsschnittstelle und der Argumenttyp der Methode, die Sie verwenden möchten, identisch sind, können Sie ihn wie folgt weglassen.

FuncUser.samplePrintFunc(Math::sin);

Lambda-Ausdrücke sind daher eine leistungsfähige Grammatik zum Übergeben von Funktionen.

Stream API

Die Stream-API ist ein Tool, das die Sammlungsverarbeitung mithilfe von Lambda-Ausdrücken wie oben beschrieben ausführt. Es ist eine API im Lambda-Stil. Ich habe diejenigen zusammengefasst, die ich oft als Beispiel verwende.

forEach Es scheint, dass nur forEach verwendet werden kann, ohne die Stream-Methode aufzurufen.

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).forEach(System.out::println);

filter Dies ist praktisch, da eine verfeinerte Suche durchgeführt wird. Es ist einfach, weil Sie nicht in jede for-Anweisung eine if-Anweisung schreiben müssen.

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).stream().filter(x -> x > 3.0).forEach(System.out::println);

map Es wird verwendet, wenn Sie eine andere Liste erstellen und aus einer Liste oder einem Satz festlegen möchten.

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).stream().map(x -> x * x).forEach(System.out::println);

collect sammeln ist mächtig und eliminiert fast das Schreiben für Aussagen.

Schreiben Sie sammeln (Lieferant (außerhalb von for variabel), Akkumulator [innerhalb von for verarbeiten], Kombinierer [Prozess zum Sammeln von Lieferanten zum Zeitpunkt der Parallelverarbeitung]).

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).stream().collect(HashMap::new, (map, x) -> map.put(x, x * x), (map1, map2) -> map1.forEach(map2::put)).entrySet().forEach(System.out::println);

Es ist auch bequem, Collectors zu verwenden. Die Verarbeitung, die Sie häufig durchführen, ist gut abstrahiert und vollständig.

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 1.0, 5.4 }).stream().collect(Collectors.toSet()).forEach(System.out::println);

mapToDouble etc... Dies ist nützlich, da Sie mithilfe des Streams mapTo [numerischer Wert] Durchschnitt, Maximum und Min verwenden können.

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).stream().mapToDouble(x -> x).average().ifPresent(System.out::println)

Versuchen Sie, die Standardabweichung zu ermitteln

Lassen Sie uns die Standardabweichung finden.

\sigma = \sqrt{\frac{1}{n} \sum_{i = 1}^n (x_i - \mu)^2}

Der folgende gewünschte Teil selbst wird mit 2 Zeilen (2. und 3. Zeile) multipliziert.

List<Double> sample = Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 });
double mu = sample.stream().mapToDouble(x -> x).average().getAsDouble();
double siguma = Math.sqrt(sample.stream().map(x -> Math.pow(x - mu, 2.0)).mapToDouble(x -> x).average().getAsDouble());
System.out.println(siguma);

Recommended Posts

Heutzutage Java Lambda Expressions und Stream API
Behandeln Sie Ausnahmen kühl mit Java 8-Lambda-Ausdrücken und der Stream-API
[Für Anfänger] Über Lambda-Ausdrücke und Stream-API
Verwenden Sie Java-Lambda-Ausdrücke außerhalb der Stream-API
Java Stream API
[Java] Stream API / Map
Verstehen Sie Java 8 Lambda-Ausdrücke
Über Java-Lambda-Ausdrücke
Erläutern Sie Java 8-Lambda-Ausdrücke
[Java] Sortieren Sie die Liste mit Streams und Lambda-Ausdrücken
Java Stream API in 5 Minuten
Java8-Stream, Zusammenfassung des Lambda-Ausdrucks
[Java] Einführung in den Lambda-Ausdruck
[Java] Stream API - Stream-Beendigungsverarbeitung
[Java] Stream API - Stream Zwischenverarbeitung
[Java] Einführung in die Stream-API
[Java] Stream API Zwischenoperation
Überdenken von Entwurfsmustern mit Java8-Lambda-Ausdrücken und Stream - Builder-Muster -
Java-Lambda-Ausdruck, der mit Comparator gelernt wurde
[Einführung in Java] Über Lambda-Ausdrücke
Java für Anfänger, Ausdrücke und Operatoren 1
Über Lambda, Stream, LocalDate von Java8
Java für Anfänger, Ausdrücke und Operatoren 2
Ich habe versucht, die Java8 Stream API zu verwenden
Java 8 ~ Stream API ~ startet jetzt
Der Ursprung von Java-Lambda-Ausdrücken
Verwendung von Java-Lambda-Ausdrücken
Implementieren Sie API Gateway Lambda Authorizer in Java Lambda
Datenverarbeitung mit der Stream-API von Java 8
Versuchen Sie es mit der Stream-API in Java
Probieren Sie verschiedene Java Stream API-Methoden aus (jetzt)
Hinweise zur Stream-API und zu SQL von Java
Java8 / 9-Anfänger: Streamen Sie API-Suchtpunkte und wie Sie damit umgehen
Interagieren Sie mit der LINE Message API mit Lambda (Java)
API-Memo streamen
Erstellen Sie eine API mit Retrofit2, Okhttp3 und Gson (Java).
[Java] Zusammenfassung, wie Lambda-Ausdrücke weggelassen werden
Probieren Sie Java 8 Stream aus
Effektive Java 3rd Edition Kapitel 7 Lambda und Stream
Verwendung der Java-API mit Lambda-Ausdrücken
Java und JavaScript
Ich habe Javas Lambda-Ausdruck Stream-API ein halbes Jahr nach dem Start von Java überprüft.
XXE und Java
Java 8 startet jetzt ~ für jeden und Lambda-Ausdruck ~
Hallo Java Lambda
[Java] Lambda-Ausdruck
Java 8 studieren (Stream)
Java Stream-Beendigung
Java Lambda Ausdruck
[Java] Stream-Verarbeitung
Grundlagen der Stream-API
Java 9 Optional :: stream
Überdenken des Entwurfsmusters mit Java8 Lambda-Ausdruck & Stream - Befehlsmuster -
Organisieren Sie den Unterschied im Schreibkomfort zwischen dem Java-Lambda-Ausdruck und dem Kotlin-Lambda-Ausdruck.
Versuchte Mastodons Toot- und Streaming-API in Java