Überprüfen Sie java8 ~ Lambda Typ ~

Ich habe in java8 keinen Code in diesem Bereich geschrieben, daher habe ich ein Gefühl der Krise verspürt und ihn gelernt. Deshalb werde ich ihn hier zusammenfassen.

Dies ist ein Beispiel, das den Inhalt der Liste in Zahlen umwandelt und ausgibt. Zunächst ein Beispiel vor java8.

Nicht java8.java



		List<String> suuzies = Arrays.asList("1", "2", null, "3");

		for (String suuzi : suuzies) {
			if (suuzi == null) {
				continue;
			}
			System.out.println(Integer.parseInt(suuzi));
		}
		
		// 1 2 3

Als nächstes kommt Java8.

java8.java


        List<String> suuzies = Arrays.asList("1", "2", null, "3");
		
        suuzies.stream().filter(s -> Objects.nonNull(s)).map(s -> Integer.parseInt(s))
               .forEach(s -> System.out.println(s));
		// 1 2 3

Toll! Es passt in eine Zeile und verbessert die Lesbarkeit! Als ich es zum ersten Mal sah, verstand ich es überhaupt nicht und dachte, was die Lesbarkeit verbessern würde. Es wird erfrischend zu verstehen sein.

Die Reihenfolge der Stream-Verarbeitung

  1. Stream-Generierung aus der Sammlung
  2. Zwischenverarbeitung
  3. Endgültige Verarbeitung Wird sein. Der obige Code lautet also
  4. Stream aus Sammlung abrufen
  5. Beseitigen Sie null
  6. Konvertieren Sie überlebende Werte in Zahlen
  7. Ausgabe nicht wahr! 2 und 3 sind Zwischenverarbeitung und 4 ist Endverarbeitung. Sie können den Zwischenprozess schreiben, bis Sie zufrieden sind, und Sie können nur einen letzten Prozess schreiben.

In Anbetracht dessen, dass Sie den Prozess so schreiben können, als ob er wie oben beschrieben durch einen Pfeil verbunden wäre, Ich bin sicher der Meinung, dass sich die Lesbarkeit verbessert hat. Wenn auf Feldebene das Nest oft chaotisch wird, Dies scheint sehr leicht zu lesen zu sein.

Der java8.java-Code kann übrigens auch wie folgt geschrieben werden.

java8(2).java


        List<String> suuzies = Arrays.asList("1", "2", null, "3");

		suuzies.stream().filter(Objects::nonNull).map(Integer::parseInt)
				.forEach(System.out::println);
		// 1 2 3

Es werden Methodenreferenzen verwendet, wodurch der Code noch kürzer wird. Ich werde die Erklärung hier weglassen.

Nachdem Sie Stream verstanden haben, werde ich ein wenig über Lambda-Ausdrücke schreiben.

Stream.class


        Stream<T> filter(Predicate<? super T> predicate);

Predicate.class


@FunctionalInterface
public interface Predicate<T> {

    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

Die oben gezeigte Filtermethode sieht beispielsweise so aus. Ich war allergisch, als ich es zum ersten Mal sah. Es schloss sofort. Schauen wir uns auch (Prädikat <? Super T>) im Argument des Filters an. Dies ist eine funktionale Schnittstelle. Ein Lambda-Ausdruck kann eine funktionale Schnittstelle mit einer kurzen Beschreibung implementieren. Eine funktionale Schnittstelle ist übrigens eine, in der nur eine abstrakte Methode definiert ist. Es ist in Ordnung, andere statische und Standardmethoden als abstrakte Methoden einzuschließen, diese werden jedoch als Bedingung ignoriert. Die Prädikatklasse zielt nur auf den "Booleschen Test (T t)" ab, die anderen werden ignoriert.

Wie Sie sehen können, verwendet diese Schnittstelle ein Argument vom Typ T und gibt einen Rückgabewert vom Typ Boolean zurück. Wiederholen Sie den Filterteil des vorherigen Codes (java8.java).

java8.java



        filter(s -> Objects.nonNull(s))

Es implementiert das Filterargument von Stream.class. Dieser Teil ist ein Lambda-Typ!

Es stehen mehrere andere Funktionsschnittstellen zur Verfügung. Mit der in java8.class verwendeten Karte

Stream.class



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

Schauen wir uns auch den Inhalt des Arguments Function an.

Function.class



@FunctionalInterface
public interface Function<T, R> {

    R apply(T t);

// and more

}

Eine Methode, die einen T-Typ als Argument verwendet und einen R-Typ zurückgibt! Mit anderen Worten, es verarbeitet das empfangene Argument und gibt es in einer anderen Form zurück!

Wiederholen Sie den Kartenteil von java8.java früher.

java8.java



        map(s -> Integer.parseInt(s))

Sie nehmen ein Zeichen als Argument, konvertieren es in eine Zahl und geben es zurück!

Die Lambda-Ausdruckssyntax sieht folgendermaßen aus.

(Argument) -> {Verarbeitung}

Es ist eine Schreibweise, weil es nur eine abstrakte Methode gibt ♪ Es gibt andere Verbraucher, die keinen Rückgabewert haben, und Lieferanten, die keine Argumente annehmen!

Ich denke, der Lambda-Ausdruck wurde für Stream gemacht! Zu Beginn des Studiums frage ich mich, ob es eine Schnittstelle für eine abstrakte Methode gibt. Ich dachte, aber wir Entwickler werden die vorbereiteten Dinge in einem Lambda-Stil implementieren Ich dachte, es wäre praktisch, wenn ich es benutzen würde!

Ich habe noch viel zu tun, deshalb werde ich von nun an mein Verständnis vertiefen!

Recommended Posts

Überprüfen Sie java8 ~ Lambda Typ ~
[Java] Lambda-Ausdruck
Java Lambda Ausdruck
Java Neutral Lambda Tabellenausdruck 1
Variationen von Java-Lambda-Ausdrücken
Java 8 Lambda-Ausdruck Feature
Java Lambda Ausdruck Memo
Java 8 studieren (Lambda-Ausdruck)
Wieder Java-Lambda-Ausdruck
[Java] Funktionsschnittstelle / Lambda-Ausdruck
Java-Überprüfung
Java8-Stream, Zusammenfassung des Lambda-Ausdrucks
Java Basic Learning Content 9 (Lambda-Ausdruck)
Was ist ein Lambda-Ausdruck (Java)
Hallo Java Lambda
Java IO Bewertung
Lassen Sie uns nun den Java-Lambda-Ausdruck rekapitulieren
NIO.2 Überprüfung von Java
Bewertung von Java Shilber
Java-Lernen (bedingter Ausdruck)
Quarkus rettet Java Lambda! ??
Verstehen Sie Java 8 Lambda-Ausdrücke
Überprüfungshinweise zu Java NIO 2
Überprüfung der Java-Innenklasse
Verwendung der Java-API mit Lambda-Ausdrücken
Überprüfen Sie jetzt die Java-Anmerkungen
Über Java-Lambda-Ausdrücke
Java 8 startet jetzt ~ für jeden und Lambda-Ausdruck ~
Einführung in den Lambda-Stil
Erläutern Sie Java 8-Lambda-Ausdrücke
NIO Bewertung von Java
Injektion von Java-Tabellenausdrücken
Zusammenfassung der regulären Ausdrücke von Java
Überdenken des Entwurfsmusters mit Java8 Lambda-Ausdruck & Stream - Befehlsmuster -
Erste Schritte mit älteren Java-Ingenieuren (Stream + Lambda)
Überdenken von Entwurfsmustern mit Java8-Lambda-Ausdrücken und Stream - Null-Objektmuster -
Überdenken des Java8-Lambda-Ausdrucks- und Stream-Entwurfsmusters - Muster der Vorlagenmethode -
Verwenden Sie Lambda-Ebenen mit Java
Progate Java (Anfänger) Review & Zusammenfassung
Überprüfungshinweise zum Java Collections Framework
[Java] Einführung in den Lambda-Ausdruck
Was ist ein Lambda-Ausdruck?
Weisen Sie Variablen Java8-Lambda-Ausdrücke zu und verwenden Sie sie erneut
Java-Lambda-Ausdruck, der mit Comparator gelernt wurde
[Einführung in Java] Über Lambda-Ausdrücke
Über Lambda, Stream, LocalDate von Java8
Ist Java unter AWS Lambda langsam?
Hallo Welt mit AWS Lambda + Java
Versuchen Sie einen If-Ausdruck in Java
Java
Java
Der Ursprung von Java-Lambda-Ausdrücken
Verwendung von Java-Lambda-Ausdrücken
Vergleich der Thread-Implementierungsmethoden in Java und der Lambda-Ausdrucksmethode
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Heutzutage Java Lambda Expressions und Stream API