Heim  >  Artikel  >  Java  >  Analyse des Quellcodes des Lambda-Ausdrucks auf Java8-Nanny-Ebene

Analyse des Quellcodes des Lambda-Ausdrucks auf Java8-Nanny-Ebene

WBOY
WBOYnach vorne
2023-04-14 23:04:031100Durchsuche

1. Ersetzen anonymer innerer Klassen

Es besteht kein Zweifel, dass der am häufigsten verwendete Anlass für Lambda-Ausdrücke darin besteht, anonyme innere Klassen zu ersetzen, und die Implementierung der Runnable-Schnittstelle ist ein klassisches Beispiel für anonyme innere Klassen. Lambda-Ausdrücke sind ziemlich mächtig. Sie können ()-> verwenden, um die gesamte anonyme innere Klasse zu ersetzen! Bitte schauen Sie sich den Code an:

Bei Verwendung einer anonymen inneren Klasse:

    @Test
    public void oldRunable() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("The old runable now is using!");
            }
        }).start();
    }

Und bei Verwendung eines Lambda-Ausdrucks:

    @Test
    public void runable() {
        new Thread(() -> System.out.println("It's a lambda function!")).start();
    }

Die endgültige Ausgabe:

Das alte Runable verwendet jetzt!

Es ist eine Lambda-Funktion!

Ja, ist es nicht erschreckend mächtig? Ist es erschreckend einfach? Ist es erschreckend klar und fokussiert? Das ist das Beängstigende an Lambda-Ausdrücken: Es wird nur sehr wenig Code benötigt, um das zu erreichen, was die vorherige Klasse getan hat!

2. Verwenden Sie Lambda-Ausdrücke, um Sammlungen zu durchlaufen.

Java-Sammlungsklassen werden häufig in der täglichen Entwicklung verwendet, und es wird sogar gesagt, dass es keinen Java-Code gibt, der keine Sammlungsklassen verwendet. . . Die häufigste Operation für Sammlungsklassen ist das iterative Durchlaufen. Bitte sehen Sie sich den Vergleich an:

    @Test
    public void iterTest() {
        List<String> languages = Arrays.asList("java","scala","python");
        //before java8
        for(String each:languages) {
            System.out.println(each);
        }
        //after java8
        languages.forEach(x -> System.out.println(x));
        languages.forEach(System.out::println);
    }

Wenn Sie mit Scala vertraut sind, müssen Sie mit forEach vertraut sein. Es durchläuft alle Objekte in der Sammlung und fügt ihnen Lambda-Ausdrücke hinzu.

languages.forEach(System.out::println);

Diese Zeile ähnelt ein wenig der Art und Weise, wie die Bereichsauflösung in C++ geschrieben wird, und sie ist auch hier möglich.

3. Verwenden Sie Lambda-Ausdrücke, um Map zu implementieren.

Wie können wir Map nicht erwähnen, wenn es um funktionale Programmierung und Lambda-Ausdrücke geht? . . Ja, Java8 wird definitiv unterstützt. Bitte schauen Sie sich den Beispielcode an:

    @Test
    public void mapTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));
    }

Das endgültige Ausgabeergebnis:

10.5

21.0

31.5

Die Kartenfunktion kann als die wichtigste Methode in der funktionalen Programmierung bezeichnet werden. Die Funktion einer Karte besteht darin, ein Objekt in ein anderes umzuwandeln. In unserem Beispiel werden die Kosten durch die Kartenmethode um das 0,05-fache erhöht und dann ausgegeben.

4. Verwenden Sie Lambda-Ausdrücke, um Map und Reduce zu implementieren.

Da Map erwähnt wird, wie können wir Reduce nicht erwähnen? Wie Map ist auch Reduce eine der wichtigsten Methoden in der funktionalen Programmierung. . . Die Funktion von Map besteht darin, ein Objekt in ein anderes umzuwandeln, während die Funktion von Reduce darin besteht, alle Werte zu einem zusammenzuführen. Bitte sehen Sie:

    @Test
    public void mapReduceTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        double allCost = cost.stream().map(x -> x+x*0.05).reduce((sum,x) -> sum + x).get();
        System.out.println(allCost);
    }

Das Endergebnis ist:

63,0

Wenn wir ein for verwenden Schleife, um es zu tun Diese Angelegenheit:

    @Test
    public void sumTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        double sum = 0;
        for(double each:cost) {
            each += each * 0.05;
            sum += each;
        }
        System.out.println(sum);
    }

Ich glaube, dass die Schreibweise von „map+reduce+lambda expression“ mehr als eine Ebene höher ist.

5.Filteroperation

Filter ist auch eine Operation, die wir häufig verwenden. Beim Betrieb einer Sammlung ist es häufig erforderlich, einige Elemente aus der ursprünglichen Sammlung herauszufiltern.

    @Test
    public void filterTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0,40.0);
        List<Double> filteredCost = cost.stream().filter(x -> x > 25.0).collect(Collectors.toList());
        filteredCost.forEach(x -> System.out.println(x));

    }

Das Endergebnis:

30.030.0

40.0

40.0

Haben Sie Lust, Java in Python oder Scala zu schreiben? Ist er nicht so hübsch?

6. Zusammenarbeit mit der funktionalen Schnittstelle Predicate

Zusätzlich zur Unterstützung des funktionalen Programmierstils auf Sprachebene fügte Java 8 auch ein Paket namens java.util.function hinzu. Es enthält viele Klassen zur Unterstützung der funktionalen Programmierung in Java. Eine davon ist Predicate. Mit der Funktionsschnittstelle java.util.function.Predicate und Lambda-Ausdrücken können Sie API-Methoden Logik hinzufügen und dynamischeres Verhalten mit weniger Code unterstützen. Die Predicate-Schnittstelle eignet sich sehr gut zum Filtern.

    public static void filterTest(List<String> languages, Predicate<String> condition) {
        languages.stream().filter(x -> condition.test(x)).forEach(x -> System.out.println(x + " "));
    }

    public static void main(String[] args) {
        List<String> languages = Arrays.asList("Java","Python","scala","Shell","R");
        System.out.println("Language starts with J: ");
        filterTest(languages,x -> x.startsWith("J"));
        System.out.println("\nLanguage ends with a: ");
        filterTest(languages,x -> x.endsWith("a"));
        System.out.println("\nAll languages: ");
        filterTest(languages,x -> true);
        System.out.println("\nNo languages: ");
        filterTest(languages,x -> false);
        System.out.println("\nLanguage length bigger three: ");
        filterTest(languages,x -> x.length() > 4);
    }

Das endgültige Ausgabeergebnis:


Sprache beginnt mit J:

Java


Sprache endet mit a:
Java

scala


Alle Sprachen:
Java
Python
scala
Shell

R

Keine Sprachen:


Sprachlänge größer drei:
Python
scala

Shell

Wie Sie sehen können, akzeptiert die Filtermethode der Stream-API auch ein Prädikat, was bedeutet, dass unsere benutzerdefinierte filter()-Methode durch den darin geschriebenen Inline-Code ersetzt werden kann , das ist auch die Magie von Lambda-Ausdrücken. 🎜

Das obige ist der detaillierte Inhalt vonAnalyse des Quellcodes des Lambda-Ausdrucks auf Java8-Nanny-Ebene. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen