[Java] Interface fonctionnelle / expression lambda

Qu'est-ce qu'une expression lambda?

Lorsque vous n'utilisez pas l'expression lambda

public class MethodRefUnuse {
//Contenu de la chaîne de caractères de sortie avec crochet
  public void walkArray(String[] data) {
    for (var value : data) {
      System.out.printf("[%s]\n", value);
    }
  }
}
//Sortir le contenu des données du tableau de chaînes de caractères dans l'ordre
public class MethodRefUnuseBasic {

  public static void main(String[] args) {
    var data = new String[] { "Le printemps est Akebono", "L'été est la nuit", "L'automne est le crépuscule" };
    var un = new MethodRefUnuse();
    un.walkArray(data); //[Le printemps est Akebono][L'été est la nuit][L'automne est le crépuscule]
  }
}

Référence de la méthode

MethodRefUnuse.java


public class MethodRefUse {

//Rendre possible de recevoir la méthode de traitement des éléments du tableau par référence de méthode
  //Dans la sortie d'argument"Faites référence à une méthode qui reçoit un argument de type String et dont la valeur de retour est void"Passer

  public void walkArray(String[] data, Output output) {
    for (var value : data) {
      output.print(value);
    }
  }
//Méthode correspondant au type de sortie (entourer la chaîne de caractères entre crochets)
  //L'état réel de la méthode d'impression définie dans l'interface fonctionnelle est la méthode addQuote.
  static void addQuote(String value) {
    System.out.printf("[%s]\n", value);
  }
}

Output.java


//Un type de méthode qui prend un argument de type String et retourne un type de méthode void
@FunctionalInterface
public interface Output {
  void print(String str);
}

MethodRefUnuseBasic.java


public class MethodRefUseBasic {

  public static void main(String[] args) {
    var data = new String[] {"Le printemps est Akebono", "L'été est la nuit", "L'automne est le crépuscule"};
    var u = new MethodRefUse();
    //Passer une référence de méthode à la méthode walkArray
    u.walkArray(data, MethodRefUse::addQuote);
  }
}

Remplacer la méthode

//Classe de compteur qui compte les chaînes
public class Counter {
  private int result = 0;

  public int getResult() {
    return this.result;
  }

  public void addLength(String value) {
    this.result += value.length();
  }
}
public class CounterBasic {

  public static void main(String[] args) {
    var data = new String[] {"Le printemps est Akebono", "L'été est la nuit", "L'automne est le crépuscule"};
    var u = new MethodRefUse();
    var c = new Counter();
    //La méthode addLength de la classe Counter ajoute la longueur de chaîne de valeur au champ de résultat
    u.walkArray(data, c::addLength);
    System.out.println(c.getResult());
  }
}

Le style Lambda apparaît ici

//Argument de la méthode walkArray Interface consommateur
//Consumer est une méthode sans retour qui prend un argument de type T et effectue un certain traitement
import java.util.function.Consumer;

public class MethodLambda {

  public void walkArray(String[] data, Consumer<String> output) {
    for (var value : data) {
      output.accept(value);
    }
  }
}

public class MethodLambdaBasic {

  public static void main(String[] args) {
    var data = new String[] { "Le printemps est Akebono", "L'été est la nuit", "L'automne est le crépuscule" };
    var ml = new MethodLambda();
    ml.walkArray(data, (String value) -> {
      System.out.printf("[%s]\n", value);
    });
  }
}

Style Lambda plus facile

Utilisation correcte avec une classe anonyme


import java.util.function.Consumer;

public class MethodLambdaBasic {

  public static void main(String[] args) {
    var data = new String[] { "Le printemps est Akebono", "L'été est la nuit", "L'automne est le crépuscule" };
    var ml = new MethodLambda();

    ml.walkArray(data, new Consumer<String>() {
      @Override
      public void accept(String value) {
        System.out.printf("[%s]\n", value);
      }
    });

     ml.walkArray(data, (String value) -> System.out.printf("[%s]\n", value));
     ml.walkArray(data, (value) -> System.out.printf("[%s]\n", value));
     ml.walkArray(data, value -> System.out.printf("[%s]\n", value));
  }
}

Exemple de méthode de framework de collecte d'expressions lambda

** Méthode replaceAll **

//Extraire uniquement les 3 premiers caractères et afficher 2 caractères ou moins tels quels
import java.util.ArrayList;
import java.util.Arrays;

public class CollReplace {

  public static void main(String[] args) {
    var list = new ArrayList<String>(
        Arrays.asList("Neko", "Inu", "Niwatori"));
    list.replaceAll(v -> {
      if (v.length() < 3) {
        return v;
      } else {
        return v.substring(0, 3);
      }
    });
    System.out.println(list); //[Nek, Inu, Niw]
  }
}
//Ajouter un acronyme clé à la valeur de la carte
import java.util.HashMap;
import java.util.Map;

public class CollReplaceMap {

  public static void main(String[] args) {
    var map = new HashMap<String, String>(
      Map.of("cat", "Chat", "dog", "Inu", "bird", "Tori"));
    map.replaceAll((k, v) -> k.charAt(0) + v);
    System.out.println(map); //{cat=chat c, dog=d Inu, bird=b Tori}
  }
}

** méthode removeIf **

//Supprimer toutes les chaînes de 5 caractères ou plus
import java.util.ArrayList;
import java.util.Arrays;

public class CollRemove {

  public static void main(String[] args) {
    var list = new ArrayList<String>(
      Arrays.asList("Rose", "Tulipe", "Asagao", "Jacinthe"));
    list.removeIf(v -> v.length() > 4);
    System.out.println(list); //[Rose",Asagao]
  }
}

** méthode de calcul **

import java.util.HashMap;
import java.util.Map;

//Ajoutez le premier caractère de la clé à la valeur (calculez/computeIfPresent)
public class CollCompute {
  public static String trans(String key, String value) {
    return key.charAt(0) + value;
  }
//Définissez la clé elle-même sur la valeur (computeIfAbsent)
  public static String trans(String key) {
    return key;
  }

  public static void main(String[] args) {
    var map = new HashMap<String, String>(Map.of("orange", "Mandarine"));

//compute
      map.compute("orange", CollCompute::trans);
      map.compute("melon", CollCompute::trans);
      System.out.println(map); //{orange = o mikan, melon=mnull}

/*
computeIfPresent: traiter uniquement si la clé existe
    map.computeIfPresent("orange", CollCompute::trans);
    map.computeIfPresent("melon", CollCompute::trans);
    System.out.println(map); //{orange = o mikan}
*/

/*computeIfAbsent: ne traite que ceux qui n'ont pas de clé
    map.computeIfAbsent("orange", CollCompute::trans);
    map.computeIfAbsent("melon", CollCompute::trans);
    System.out.println(map); //{orange = orange, melon=melon}
*/
  }
}

méthode de fusion

//Concaténer les valeurs séparées par des virgules lors de la duplication des valeurs
import java.util.HashMap;
import java.util.Map;

public class CollMerge {
    public static String concat(String v1, String v2) {
        if(v2 == "") {return null;}
        return v1 + "," + v2;
    }
    public static void main(String[] args) {
        var map = new HashMap<String, String>(Map.of("cat", "chat trois couleurs"));
        map.merge("dog", "Pomera An", CollMerge::concat);
        map.merge("cat", "Persha", CollMerge::concat);
        map.merge("dog", "Caniche", CollMerge::concat);
        System.out.println(map); //{dog=Pomera An,Caniche, cat=chat trois couleurs,Persha}

        //Fonction de jointure(remap)Ignore la clé elle-même si renvoie null
        map.merge("cat", "", CollMerge::concat);
        System.out.println(map); //{dog=Pomera An,Caniche}
    }
}

Recommended Posts

[Java] Interface fonctionnelle / expression lambda
[Java] Expression Lambda
[Java] Interface fonctionnelle
Expression lambda Java
À propos de l'interface fonctionnelle Java
interface de type de fonction standard java
expression 1 de la table lambda neutre java
Variations d'expressions lambda Java
Fonctionnalité d'expression lambda Java 8
mémo d'expression java lambda
expression lambda java [écriture de notes]
Etudier Java 8 (expression lambda)
Évaluer java8 ~ Type Lambda ~
Expression lambda Java à nouveau
Flux Java8, résumé de l'expression lambda
java (interface)
interface [java]
Contenu d'apprentissage de base Java 9 (expression lambda)
Qu'est-ce qu'une expression lambda (Java)
À propos de l'interface Java
Récapitulons maintenant l'expression lambda Java
Introduction de l'interface fonctionnelle
Interface [Java]
Bonjour Java Lambda
À propos de l'interface, interface java
Comment utiliser l'API Java avec des expressions lambda
Java 8 pour démarrer maintenant ~ for Each et expression lambda ~
Repenser le modèle d'expression et de conception de flux Java8 Lambda - Modèle de commande -
Interface appelable en Java
apprentissage java (expression conditionnelle)
Une note de revue sur l'interface fonctionnelle
Quarkus enregistre Java Lambda! ??
Comprendre les expressions lambda Java 8
Interface d'historique d'apprentissage JAVA
À propos des expressions Java lambda
Introduction au style lambda
Expliquer les expressions lambda Java 8
Mémo d'apprentissage Java (interface)
Injection d'expression de table Java
résumé des expressions régulières java
Premiers pas avec les anciens ingénieurs Java (Stream + Lambda)
Repenser le modèle d'expression et de conception de flux Java8 Lambda - Modèle d'objet nul -
Repenser les modèles d'expression et de conception de flux Java8 - Modèle de méthode
Utiliser des couches Lambda avec Java
Résumé d'héritage avancé, interface -java
Attribuer des expressions lambda Java8 aux variables et les réutiliser
Héritage de l'interface de l'historique d'apprentissage JAVA
Essayez le type fonctionnel en Java! ①
Vérifier la méthode privée de l'interface Java9
[Java] Introduction à l'expression lambda
Qu'est-ce qu'une expression lambda?
Java8 Lambda Expression & Stream Design Pattern Repenser - Modèle de chaîne de responsabilité -
Implémenter un tri rapide de type fonction en Java
Accéder à l'interface réseau avec Java
Expression lambda Java apprise avec Comparator
Jusqu'à ce que l'implémentation de l'interface devienne lambda
[Introduction à Java] À propos des expressions lambda
Java et fonctions principales - au-delà de l'interface fonctionnelle -
À propos de Lambda, Stream, LocalDate de Java8