Inhaltsverzeichnis
Vorwort
Jack-Konfiguration
retrolambda-Konfiguration
So verwenden Sie den Lambda-Ausdruck
Der einfachste Lambda-Ausdruck
Heim Java javaLernprogramm Detaillierte Einführung in den Beispielcode von Lambda Expression, einer neuen Funktion von Android mit Java 8

Detaillierte Einführung in den Beispielcode von Lambda Expression, einer neuen Funktion von Android mit Java 8

Mar 11, 2017 am 11:54 AM

Vorwort

Lambda-Ausdruck, eine neue Funktion von Java8. Mithilfe des Lambda-Ausdrucks können Sie die Schnittstellenimplementierung durch nur eine Funktion ersetzen, sich von anonymen inneren Klassen verabschieden und der Code sieht prägnanter und leichter verständlich aus.
Java8 hat auch einige andere neue Funktionen, die jedoch möglicherweise nicht auf Android verfügbar sind.
Studio 2.x und höher unterstützt den Jack-Compiler. Mit ihm können Sie den Lambda-Ausdruck von Java8 verwenden, es gibt jedoch keine Garantie, dass andere Funktionen verfügbar sind.

Hinweis: Das Android SDK integriert einen Teil des Quellcodes des JDK. Einigen Klassen im nativen JDK sind möglicherweise einige Implementierungen neuer Funktionen hinzugefügt, bei denen in Android jedoch nicht. Ein weiteres Beispiel ist das java.util.function-Paket von java8, das in niedrigeren Versionen nicht verfügbar ist

Sie können auch das Plug-in retrolambda verwenden, um den Lambda-Ausdruck von java8 zu unterstützen.

Jack-Konfiguration

Fügen Sie die folgende Konfiguration hinzu

android {
    jackOptions {
        enabled true
    }
    compileOptions {//jack、retrolambda编译必需        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
Nach dem Login kopieren

, damit der Jack-Compiler den Lambda-Ausdruck unterstützen kann

Verwenden Sie die neueste Version 2.3 Studio, JDK 1.8-Umgebung, Gradle2.3 und die obige Konfiguration
Nach dem Testen kann es auch auf dem 4.4-Simulator
ausgeführt werden Konfigurationsdemo: http://www.php.cn/

retrolambda-Konfiguration

retrolambda ist mit Java5, 6 und 7 unter Verwendung des Lambda-Ausdrucks kompatibel.

Die Konfiguration ist wie folgt

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'me.tatarka:gradle-retrolambda:3.6.0'
    }}
apply plugin: 'me.tatarka.retrolambda'android {
    defaultConfig {
        minSdkVersion 11 //这个没有硬性要求
    }
    compileOptions {//jack、retrolambda编译必需
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }}
Nach dem Login kopieren

Hinweis: Viele Open-Source-Projekte verwenden immer noch Retrolambda

So verwenden Sie den Lambda-Ausdruck

Zunächst müssen wir wissen, dass dieser Ausdruck als Ganzes einen „Objekttyp“ ausdrückt.

Der einfachste Lambda-Ausdruck

Code:

Runnable runnable = () -> System.out.println("hi, 我是 stone");runnable.run();
Nach dem Login kopieren

() ist eigentlich die Methodenparameterliste. Wenn hier keine Parameter übergeben werden, entspricht sie der Methode ohne Parameter . Da Runnable nur einen void run() hat, wird der Methodenname hier nicht geschrieben, sodass der Methodenname ignoriert wird.

-> Darauf folgt der Methodenkörper. Hier gibt es nur einen Druckcode. Sie können die geschweiften Klammern des Methodenkörpers weglassen: {}.

Hinweis: Code wie „new Runnable“ wird hier ebenfalls weggelassen, da der Compiler eine automatische Typinferenz durchführt. Wenn Sie () direkt aufrufen -> >

Lambda-Ausdruck mit Parametern und Rückgabewert

Code:

button.setOnTouchListener((view, event)-> {    
if (event.getAction() == MotionEvent.ACTION_DOWN) {        
if (flag) {            
return true;
        }
    }    return super.onTouchEvent(event);
});
Nach dem Login kopieren
Wenn Parameter vorhanden sind, übergeben Sie einfach den Parameternamen, und der Name kann nach Belieben definiert werden ; Typdefinition oder Es spielt keine Rolle, ob es nicht definiert ist. Wenn es nicht definiert ist, leitet der Compiler es automatisch ab.

Wenn ein Rückgabewert vorhanden ist, können Sie return im Methodenkörper verwenden. Sie können return auch weglassen, wenn nur ein Teil des Codes vorhanden ist, wie folgt:

button.setOnTouchListener((v, e) -> super.onTouchEvent(e));
Nach dem Login kopieren
Passen Sie die Schnittstelle an und verwenden Sie sie Lambda-Ausdruck

Definieren Sie zunächst eine Schnittstelle mit nur einer abstrakten Methode:

    interface IGetData<T> {//lambda只能用于单一方法类型匹配
        T get();//      T getOne(int i); //多个抽象方法,直接编译不过
    }
Nach dem Login kopieren
Definieren Sie die Methode mit den Parametern wie die oben definierte Schnittstelle:

    void print(IGetData<String> data) {        
    String msg = data.get();        
    System.out.println(msg);
    }
Nach dem Login kopieren
Verwenden Sie Lambda Ausdruck als Parameter und Aufruf von print():

        print(() -> "张三");        print(() -> {
            System.out.println("干活了");            return "李四";
        });
Nach dem Login kopieren
Ausgabe:

03-08 06:46:00.430 1510-1510/? I/System.out: 张三
03-08 06:46:00.430 1510-1510/? I/System.out: 干活了
03-08 06:46:00.430 1510-1510/? I/System.out: 李四
Nach dem Login kopieren
Lambda-Ausdruck verwenden, um das Commander-Muster zu vereinfachen

Funktionen und einfacher Implementierungsprozess von Commander-Muster:

  • Eine Befehlsschnittstelle definiert eine abstrakte Methode zur einheitlichen Ausführung von Befehlen

  • Jeder spezifische Commander implementiert die Befehlsschnittstelle und verlässt sich auf einen Empfänger Objekt, Befehl Der Ausführungsagent wird dem Empfänger übergeben, um die Aufruferklasse

  • auszuführen, die auf einem Befehlsschnittstellenobjekt basiert und von der Befehlsschnittstelle ausgeführt wird. Übergeben Sie verschiedene spezifische Befehle polymorph, und letztendlich übernimmt der Empfänger unterschiedliche Ausführungsmethoden

Beispiel (ursprüngliche Implementierung)

Zum Beispiel gibt es einige Dateioperationsbefehle:öffnen, Schließen, Speichern, Löschen, der Empfänger ist ein Editor-Editor

Nun, zunächst müssen Sie eine Befehlsschnittstelle definieren: IAction

public interface IAction {//原 命令者  抽象出一个 执行命令的方法
    void perform();
}
Nach dem Login kopieren
und dann vier spezifische Befehlsklassen OpenAction, CloseAction, SaveAction und DeleteAction definieren.

CloseAction-Code:

public class CloseAction implements IAction {
    private Editor mEditor;    
    public CloseAction(Editor editor) {        
    this.mEditor = editor;
    }    
    @Override
    public void perform() {        
    this.mEditor.close();
    }
}
Nach dem Login kopieren
Die anderen drei Implementierungen ähneln CloseAction.

Editor-Klasse (Empfänger) definiert jede spezifische Implementierung des Empfangs von vier Befehlen:

public class Editor {     public void save() {
          System.out.println("save");
      }      public void delete() {
          System.out.println("delete");
      }      public void open() {
          System.out.println("open");
      }      public void close() {
          System.out.println("close");
      }
}
Nach dem Login kopieren
Hinweis: Wenn verschiedene Editoren unterschiedliche Anforderungen an diese Befehle haben, wenn es unterschiedliche Implementierungen gibt, Sie können auch eine IEditor-Schnittstelle definieren und dann verschiedene Editoren implementieren. Auf diesen Punkt wird nicht näher eingegangen

Schließlich gibt es einen Aufrufer, der eine Klasse sein kann:

public class Invoker {  
    private IAction action;  

    public Invoker(IAction action) {  
        this.action = action;  
    }  

    public void invoke() {  
        this.action.perform();  
    }  
}
Nach dem Login kopieren
Client initiiert einen Befehl:

Editor editor = new Editor();
new Invoker(new OpenAction(editor)).invoke();
new Invoker(new CloseAction(editor)).invoke();
new Invoker(new SaveAction(editor)).invoke();
new Invoker(new DeleteAction(editor)).invoke();
Nach dem Login kopieren
Der Aufrufer kann hier nicht als Klasse, sondern als Methode im Client definiert werden:

private void invoke(IAction action) {
    action.perform();
}
Nach dem Login kopieren
Client initiiert einen Befehlsaufruf:

 invoke(new OpenAction(editor)); 
 invoke(new CloseAction(editor)); 
 invoke(new SaveAction(editor)); 
 invoke(new DeleteAction(editor));
Nach dem Login kopieren
Lambda-Ausdruck Vereinfachte Version

behält den Aufruf (Iaction-Aktion) in IAction, Editor und Client bei.

Client initiiert einen Befehlsaufruf:

  Editor editor = new Editor();
  invoke(() -> editor.open());  
  invoke(() -> editor.close());  
  invoke(() -> editor.save());  
  invoke(() -> editor.delete());
Nach dem Login kopieren
Auf diese Weise entfällt nach Verwendung des Lambda-Ausdrucks die Definition der spezifischen Befehlsklasse. Und Sie sehen auf einen Blick, welche Methode letztendlich ausgeführt wurde.

Machen Sie sich keine Sorgen, dass das Schreiben auf diese Weise die ursprüngliche Trennung von Anforderung und Ausführung des Commander-Modus zerstört.

Denn invoke(() -> editor.open()); <==>

invoke(new IAction() {    @Override
    public void perform() {
        editor.open();
    }
});
Nach dem Login kopieren
Wenn Sie die aufrufende Klasse Invoker beibehalten, wird sie wie folgt aufgerufen:

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in den Beispielcode von Lambda Expression, einer neuen Funktion von Android mit Java 8. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie behandeln Lambda-Ausdrücke Ausnahmen in C++? Wie behandeln Lambda-Ausdrücke Ausnahmen in C++? Apr 17, 2024 pm 12:42 PM

In C++ gibt es zwei Möglichkeiten, Ausnahmen mit Lambda-Ausdrücken zu behandeln: Die Ausnahme mit einem Try-Catch-Block abfangen und die Ausnahme im Catch-Block behandeln oder erneut auslösen. Mithilfe einer Wrapper-Funktion vom Typ std::function kann die Methode try_emplace Ausnahmen in Lambda-Ausdrücken abfangen.

Wie berechnet man das Datum vor einem Jahr oder einem Jahr später in Java 8? Wie berechnet man das Datum vor einem Jahr oder einem Jahr später in Java 8? Apr 26, 2023 am 09:22 AM

Java8 berechnet das Datum vor einem Jahr oder ein Jahr später mithilfe der minus()-Methode, um das Datum vor einem Jahr zu berechnen packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[ ]args ){LocalDatetoday=LocalDate.now();LocalDate previousYear=today.minus(1,ChronoUni

Was bedeutet der Abschluss im C++-Lambda-Ausdruck? Was bedeutet der Abschluss im C++-Lambda-Ausdruck? Apr 17, 2024 pm 06:15 PM

In C++ ist ein Abschluss ein Lambda-Ausdruck, der auf externe Variablen zugreifen kann. Um einen Abschluss zu erstellen, erfassen Sie die äußere Variable im Lambda-Ausdruck. Abschlüsse bieten Vorteile wie Wiederverwendbarkeit, Ausblenden von Informationen und verzögerte Auswertung. Sie sind in realen Situationen nützlich, beispielsweise bei Ereignishandlern, bei denen der Abschluss auch dann noch auf die äußeren Variablen zugreifen kann, wenn diese zerstört werden.

Welche Vorteile bietet die Verwendung von C++-Lambda-Ausdrücken für die Multithread-Programmierung? Welche Vorteile bietet die Verwendung von C++-Lambda-Ausdrücken für die Multithread-Programmierung? Apr 17, 2024 pm 05:24 PM

Zu den Vorteilen von Lambda-Ausdrücken in der C++-Multithread-Programmierung gehören Einfachheit, Flexibilität, einfache Parameterübergabe und Parallelität. Praktischer Fall: Verwenden Sie Lambda-Ausdrücke, um Multithreads zu erstellen und Thread-IDs in verschiedenen Threads zu drucken, was die Einfachheit und Benutzerfreundlichkeit dieser Methode demonstriert.

Wie implementiert man einen Abschluss im C++-Lambda-Ausdruck? Wie implementiert man einen Abschluss im C++-Lambda-Ausdruck? Jun 01, 2024 pm 05:50 PM

C++-Lambda-Ausdrücke unterstützen Abschlüsse, die Funktionsbereichsvariablen speichern und sie für Funktionen zugänglich machen. Die Syntax lautet [capture-list](parameters)->return-type{function-body}. Capture-Liste definiert die zu erfassenden Variablen. Sie können [=] verwenden, um alle lokalen Variablen nach Wert zu erfassen, [&], um alle lokalen Variablen nach Referenz zu erfassen, oder [Variable1, Variable2,...], um bestimmte Variablen zu erfassen. Lambda-Ausdrücke können nur auf erfasste Variablen zugreifen, den ursprünglichen Wert jedoch nicht ändern.

Wie erfasst ein C++-Lambda-Ausdruck externe Variablen? Wie erfasst ein C++-Lambda-Ausdruck externe Variablen? Apr 17, 2024 pm 04:39 PM

Es gibt drei Möglichkeiten, Lambda-Ausdrücke externer Variablen in C++ zu erfassen: Erfassung nach Wert: Erstellen Sie eine Kopie der Variablen. Erfassen nach Referenz: Rufen Sie eine Variablenreferenz ab. Gleichzeitige Erfassung nach Wert und Referenz: Ermöglicht die Erfassung mehrerer Variablen, entweder nach Wert oder nach Referenz.

Wie berechnet man das Datum eine Woche später mit Java 8? Wie berechnet man das Datum eine Woche später mit Java 8? Apr 21, 2023 pm 11:01 PM

So berechnen Sie das Datum eine Woche später in Java8. In diesem Beispiel wird das Datum eine Woche später berechnet. Das LocalDate-Datum enthält keine Zeitinformationen. Seine plus()-Methode wird zum Hinzufügen von Tagen, Wochen und Monaten verwendet. Die ChronoUnit-Klasse deklariert diese Zeiteinheiten. Da LocalDate ebenfalls ein unveränderlicher Typ ist, müssen Sie Variablen verwenden, um nach der Rückgabe Werte zuzuweisen. packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo08{publicstaticvoidmain(String[

C++-Funktionsaufruf Lambda-Ausdruck: Callback-Optimierung für Parameterübergabe und Rückgabewert C++-Funktionsaufruf Lambda-Ausdruck: Callback-Optimierung für Parameterübergabe und Rückgabewert May 03, 2024 pm 12:12 PM

In C++ können Sie Lambda-Ausdrücke als Funktionsparameter verwenden, um die Flexibilität von Rückruffunktionen zu erreichen. Konkret: Parameterübergabe: Wickeln Sie den Lambda-Ausdruck durch std::function und übergeben Sie ihn in Form eines Funktionszeigers an die Funktion. Rückgabewertverarbeitung: Geben Sie den Rückgabewerttyp an, wenn Sie den Rückruffunktionszeiger mit std::function deklarieren. Praktischer Fall: Optimieren Sie Rückrufe bei der GUI-Ereignisverarbeitung, vermeiden Sie die Erstellung unnötiger Objekte oder Funktionszeiger und verbessern Sie die Einfachheit und Wartbarkeit des Codes.

See all articles