Table des matières
Avant-propos
Configuration Jack
retrolambda Configuration
Comment utiliser l'expression Lambda
L'expression Lambda la plus simple
Expression lambda avec paramètres et valeur de retour
Personnalisez l'interface et utilisez Expression lambda
Utiliser l'expression Lambda pour simplifier le modèle de commandant
Exemple (implémentation originale)
Expression Lambda Version simplifiée
Maison Java javaDidacticiel Introduction détaillée à l'exemple de code de l'expression Lambda, une nouvelle fonctionnalité d'Android utilisant Java 8

Introduction détaillée à l'exemple de code de l'expression Lambda, une nouvelle fonctionnalité d'Android utilisant Java 8

Mar 11, 2017 am 11:54 AM

Avant-propos

Expression Lambda, une nouvelle fonctionnalité de java8. En utilisant l'expression Lambda, vous pouvez remplacer l'implémentation de l'interface par une seule fonction, dire adieu aux classes internes anonymes et le code semble plus concis et facile à comprendre.
Java8 propose également d'autres nouvelles fonctionnalités, mais elles peuvent ne pas être disponibles sur Android.
Studio 2.x et versions ultérieures prennent en charge le compilateur jack. En l'utilisant, vous pouvez utiliser l'expression Lambda de java8, mais rien ne garantit que d'autres fonctionnalités seront disponibles.

Remarque : Le SDK Android intègre du code source du JDK. Certaines classes du JDK natif peuvent avoir des implémentations de nouvelles fonctionnalités ajoutées, mais pas celles d'Android. Un autre exemple est le package java.util.function de java8, qui n'est pas disponible dans les versions inférieures

Vous pouvez également utiliser le plug-in retrolambda pour prendre en charge l'expression Lambda de java8.

Configuration Jack

Ajoutez la configuration suivante

android {
    jackOptions {
        enabled true
    }
    compileOptions {//jack、retrolambda编译必需        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
Copier après la connexion

pour permettre au compilateur Jack de prendre en charge l'expression Lambda

Utilisez la dernière version 2.3 studio, environnement jdk 1.8, gradle2.3 et la configuration ci-dessus
Après test, il peut également être exécuté sur le simulateur 4.4
Démo de configuration : http://www.php.cn/

retrolambda Configuration

retrolambda est compatible avec java5, 6 et 7 en utilisant l'expression Lambda.

La configuration est la suivante

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
    }}
Copier après la connexion

Remarque : de nombreux projets open source utilisent encore retrolambda

Comment utiliser l'expression Lambda

Tout d'abord, ce qu'il faut savoir, c'est que cette expression dans son ensemble exprime un "type d'objet".

L'expression Lambda la plus simple

Code :

Runnable runnable = () -> System.out.println("hi, 我是 stone");runnable.run();
Copier après la connexion

() est en fait la liste des paramètres de la méthode. Si aucun paramètre n'est transmis ici, elle correspondra à la méthode sans paramètres. , comme Runnable n'a qu'un seul void run(), il sera mis en correspondance ; le nom de la méthode n'est pas écrit ici, donc le nom de la méthode sera ignoré.

-> Ceci est suivi du corps de la méthode. Il n'y a qu'un seul code d'impression ici, vous pouvez omettre les accolades du corps de la méthode : {}.

Remarque : le code tel que "new Runnable" est également omis ici car le compilateur effectuera une inférence de type automatique. Si vous appelez () directement -> System.out.println(“salut, je suis stone”).run(); alors il ne sera pas compilé car le compilateur ne sait pas dans quelle classe rechercher la méthode correspondante

Expression lambda avec paramètres et valeur de retour

Code :

button.setOnTouchListener((view, event)-> {    
if (event.getAction() == MotionEvent.ACTION_DOWN) {        
if (flag) {            
return true;
        }
    }    return super.onTouchEvent(event);
});
Copier après la connexion

Quand il y a des paramètres, passez simplement le nom du paramètre, et le nom peut être défini à volonté ; définition de type ou Peu importe s'il n'est pas défini ; lorsqu'il n'est pas défini, le compilateur le déduira automatiquement.
Lorsqu'il y a une valeur de retour, vous pouvez utiliser return dans le corps de la méthode ; vous pouvez également omettre return lorsqu'il n'y a qu'un morceau de code, comme suit :

button.setOnTouchListener((v, e) -> super.onTouchEvent(e));
Copier après la connexion

Personnalisez l'interface et utilisez Expression lambda

Définissez d'abord une interface avec une seule méthode abstraite :

    interface IGetData<T> {//lambda只能用于单一方法类型匹配
        T get();//      T getOne(int i); //多个抽象方法,直接编译不过
    }
Copier après la connexion

Définissez la méthode, et les paramètres sont l'interface définie ci-dessus :

    void print(IGetData<String> data) {        
    String msg = data.get();        
    System.out.println(msg);
    }
Copier après la connexion

Utilisez Expression Lambda comme paramètre et appel print() :

        print(() -> "张三");        print(() -> {
            System.out.println("干活了");            return "李四";
        });
Copier après la connexion

Sortie :

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: 李四
Copier après la connexion

Utiliser l'expression Lambda pour simplifier le modèle de commandant

Caractéristiques et processus de mise en œuvre simple de le modèle de commandant :

  • Une interface de commande définit une méthode abstraite pour exécuter les commandes de manière uniforme

  • Chaque commandant spécifique implémente l'interface de commande et s'appuie sur un objet récepteur, commande L'agent d'exécution est donné au récepteur pour exécuter la classe d'appelant

  • , qui s'appuie sur un objet d'interface de commande et est exécutée par l'interface de commande. Passer polymorphiquement dans différents commandants spécifiques, et finalement le récepteur adopte différentes méthodes d'exécution

Exemple (implémentation originale)

Par exemple, il existe des commandes d'opération de fichiers :open, fermer, enregistrer, supprimer, le récepteur est un éditeur éditeur
Eh bien, vous devez d'abord définir une interface de commande : IAction

public interface IAction {//原 命令者  抽象出一个 执行命令的方法
    void perform();
}
Copier après la connexion

, puis définir quatre classes de commandes spécifiques OpenAction, CloseAction, SaveAction et DeleteAction.
Code CloseAction :

public class CloseAction implements IAction {
    private Editor mEditor;    
    public CloseAction(Editor editor) {        
    this.mEditor = editor;
    }    
    @Override
    public void perform() {        
    this.mEditor.close();
    }
}
Copier après la connexion

Les trois autres implémentations sont similaires à CloseAction.

La classe éditeur (récepteur) définit chaque implémentation spécifique de la réception de quatre commandes :

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");
      }
}
Copier après la connexion

Remarque : si différents éditeurs ont des exigences différentes pour ces commandes, s'il existe différentes implémentations, vous pouvez également définir une interface IEditor puis implémenter différents éditeurs. Ce point ne sera pas abordé en détail

Enfin il y a un appelant, qui peut être une classe :

public class Invoker {  
    private IAction action;  

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

    public void invoke() {  
        this.action.perform();  
    }  
}
Copier après la connexion

le client initie une commande :

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();
Copier après la connexion

L'appelant ici peut être défini non pas comme une classe, mais comme une méthode dans le client :

private void invoke(IAction action) {
    action.perform();
}
Copier après la connexion

Le client initie un appel de commande :

 invoke(new OpenAction(editor)); 
 invoke(new CloseAction(editor)); 
 invoke(new SaveAction(editor)); 
 invoke(new DeleteAction(editor));
Copier après la connexion

Expression Lambda Version simplifiée

conserve l'invocation (action Iaction) dans IAction, l'éditeur et le client.

le client lance un appel de commande :

  Editor editor = new Editor();
  invoke(() -> editor.open());  
  invoke(() -> editor.close());  
  invoke(() -> editor.save());  
  invoke(() -> editor.delete());
Copier après la connexion

De cette façon, après avoir utilisé l'expression Lambda, la définition de la classe de commande spécifique est omise. Et vous pouvez voir d’un seul coup d’œil quelle méthode a finalement été exécutée.

Ne vous inquiétez pas, l'écrire ainsi détruira la séparation originale de la demande et de l'exécution du mode commandant.
Parce queinvoke(() -> editor.open()); <==>

invoke(new IAction() {    @Override
    public void perform() {
        editor.open();
    }
});
Copier après la connexion

Si vous conservez la classe appelante Invoker, elle sera appelée comme suit :

new Invoker(() -> editor.open()).invoke();
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment les expressions lambda gèrent-elles les exceptions en C++ ? Comment les expressions lambda gèrent-elles les exceptions en C++ ? Apr 17, 2024 pm 12:42 PM

En C++, il existe deux manières de gérer les exceptions à l'aide d'expressions Lambda : intercepter l'exception à l'aide d'un bloc try-catch et gérer ou renvoyer l'exception dans le bloc catch. À l'aide d'une fonction wrapper de type std::function, sa méthode try_emplace peut intercepter les exceptions dans les expressions Lambda.

Comment calculer la date il y a un an ou un an plus tard en Java 8 ? Comment calculer la date il y a un an ou un an plus tard en Java 8 ? Apr 26, 2023 am 09:22 AM

Java8 calcule la date il y a un an ou un an plus tard à l'aide de la méthode minus() pour calculer la date il y a un an packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[ ]args ){LocalDatetoday=LocalDate.now();LocalDatepreviousYear=today.minus(1,ChronoUni

Quelle est la signification de la fermeture dans l'expression lambda C++ ? Quelle est la signification de la fermeture dans l'expression lambda C++ ? Apr 17, 2024 pm 06:15 PM

En C++, une fermeture est une expression lambda qui peut accéder à des variables externes. Pour créer une fermeture, capturez la variable externe dans l'expression lambda. Les fermetures offrent des avantages tels que la réutilisabilité, la dissimulation des informations et une évaluation paresseuse. Ils sont utiles dans des situations réelles telles que les gestionnaires d'événements, où la fermeture peut toujours accéder aux variables externes même si elles sont détruites.

Quels sont les avantages de l'utilisation des expressions lambda C++ pour la programmation multithread ? Quels sont les avantages de l'utilisation des expressions lambda C++ pour la programmation multithread ? Apr 17, 2024 pm 05:24 PM

Les avantages des expressions lambda dans la programmation multithread C++ incluent la simplicité, la flexibilité, la facilité de passage des paramètres et le parallélisme. Cas pratique : utilisez des expressions lambda pour créer des multi-threads et imprimer des ID de thread dans différents threads, démontrant la simplicité et la facilité d'utilisation de cette méthode.

Comment implémenter la fermeture dans une expression C++ Lambda ? Comment implémenter la fermeture dans une expression C++ Lambda ? Jun 01, 2024 pm 05:50 PM

Les expressions C++ Lambda prennent en charge les fermetures, qui enregistrent les variables de portée de fonction et les rendent accessibles aux fonctions. La syntaxe est [capture-list](parameters)->return-type{function-body}. capture-list définit les variables à capturer. Vous pouvez utiliser [=] pour capturer toutes les variables locales par valeur, [&] pour capturer toutes les variables locales par référence, ou [variable1, variable2,...] pour capturer des variables spécifiques. Les expressions Lambda ne peuvent accéder qu'aux variables capturées mais ne peuvent pas modifier la valeur d'origine.

Comment une expression lambda C++ capture-t-elle les variables externes ? Comment une expression lambda C++ capture-t-elle les variables externes ? Apr 17, 2024 pm 04:39 PM

Il existe trois façons de capturer des expressions lambda de variables externes en C++ : Capture par valeur : créez une copie de la variable. Capture par référence : obtenez une référence de variable. Capture par valeur et référence simultanément : permet de capturer plusieurs variables, soit par valeur, soit par référence.

Appel de fonction C++ Expression Lambda : optimisation du rappel pour le passage des paramètres et la valeur de retour Appel de fonction C++ Expression Lambda : optimisation du rappel pour le passage des paramètres et la valeur de retour May 03, 2024 pm 12:12 PM

En C++, vous pouvez utiliser des expressions Lambda comme paramètres de fonction pour bénéficier de la flexibilité des fonctions de rappel. Plus précisément : passage de paramètres : encapsulez l'expression Lambda via std::function et transmettez-la à la fonction sous la forme d'un pointeur de fonction. Traitement de la valeur de retour : spécifiez le type de valeur de retour lors de la déclaration du pointeur de fonction de rappel à l'aide de std::function. Cas pratique : optimisez les rappels dans le traitement des événements de l'interface graphique, évitez de créer des objets ou des pointeurs de fonction inutiles et améliorez la simplicité et la maintenabilité du code.

Comment calculer la date une semaine plus tard en utilisant Java 8 ? Comment calculer la date une semaine plus tard en utilisant Java 8 ? Apr 21, 2023 pm 11:01 PM

Comment calculer la date une semaine plus tard en Java8 Cet exemple calculera la date une semaine plus tard. La date LocalDate ne contient pas d'informations de temps. Sa méthode plus() est utilisée pour ajouter des jours, des semaines et des mois. La classe ChronoUnit déclare ces unités de temps. Puisque LocalDate est également un type immuable, vous devez utiliser des variables pour attribuer des valeurs après le retour. packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo08{publicstaticvoidmain(String[

See all articles