Essayez une expression If en Java

Préface

Cet article a été créé impulsivement sous l'influence de cet article. Fille de 4 ans "Papa, utilise seulement const?"

Texte

Aimez-vous Java, tout le monde?

Je ne l'aimais pas beaucoup jusqu'à récemment, mais aujourd'hui je l'aime beaucoup.

Il existe de nombreuses bibliothèques, une syntaxe moderne et un sucre de syntaxe.

Cependant, je ne peux pas accepter qu'il n'y ait pas d'expression If, alors j'ai fait quelque chose comme ça.

Produit fini

public class Iff<T, R> {
  Map<Predicate<T>, Supplier<R>> evaluations = new LinkedHashMap<>();
  private Supplier<R> elsef;

  public Iff(Predicate<T> condition, Supplier<R> then) {
    evaluations.put(condition, then);
  }

  public Iff<T, R> elseIf(Predicate<T> condition, Supplier<R> then) {
    evaluations.put(condition, then);
    return this;
  }

  public Iff<T, R> elsef(Supplier<R> elsef) {
    this.elsef = elsef;
    return this;
  }

  public Optional<R> eval(T target) {
    for (Map.Entry<Predicate<T>, Supplier<R>> entry : this.evaluations.entrySet()) {
      if (entry.getKey().test(target)) {
        var value = entry.getValue().get();
        return Objects.isNull(value) ? Optional.empty() : Optional.of(value);
      }
    }
    if (this.elsef == null) {
      return Optional.empty();
    } else {
      var result = this.elsef.get();
      if (Objects.isNull(result)) {
        return Optional.empty();
      }
      return Optional.of(result);
    }
  }
}

C'est une classe qui prend un paramètre T comme argument, le vérifie et renvoie une valeur de ʻOptional `(vraiment c'est une expression if ...?)

Comment utiliser

J'ai écrit un échantillon comme test.


class IffTest {

  @Test
  public void testIf() {
    //Évaluer la chaîne et renvoyer un entier
    var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100).eval("hogeFuga");
    Assertions.assertEquals(result.get(), 100);
  }

  @Test
  public void testIfElseFirstMatch() {
    //Vous pouvez ajouter elseIf autant de fois que vous le souhaitez avec la méthode elseIf.
    var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100)
      .elseIf((str) -> str.startsWith("hogeFuga"), () -> 200)
      .elseIf((str) -> str.startsWith("hoho"), () -> 300)
      .eval("hogeFuga");
    Assertions.assertEquals(result.get(), 100);
  }

  @Test
  public void noMatch() {
    var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100)
      .elseIf((str) -> str.startsWith("hogeFuga"), () -> 200)
      .elseIf((str) -> str.startsWith("hoho"), () -> 300)
      //Vous pouvez définir le comportement dans le cas de else avec la méthode elsef
      .elsef(() -> 400)
      .eval(UUID.randomUUID().toString());
    Assertions.assertEquals(result.get(), 400);
  }

  @Test
  public void noMatchNotExistsElse() {
    var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100)
      .elseIf((str) -> str.startsWith("hogeFuga"), () -> 200)
      .elseIf((str) -> str.startsWith("hoho"), () -> 300)
      .eval(UUID.randomUUID().toString());
    //Si aucune des expressions ne correspond, Empty sera retourné
    result.ifPresentOrElse(v -> {
      Assertions.fail();
    }, () -> {
      //S'il en est autrement, la réponse est correcte
    });
  }

  @Test
  public void elseResultIsNull() {
    var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100)
      .elseIf((str) -> str.startsWith("hogeFuga"), () -> 200)
      .elseIf((str) -> str.startsWith("hoho"), () -> 300)
      .elsef(() -> null)
      .eval(UUID.randomUUID().toString());
    Assertions.assertTrue(result.isEmpty());
  }

  @Test
  public void elseIfResultIsNull() {
    var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100)
      .elseIf((str) -> str.startsWith("mogemoge"), () -> null)
      .elseIf((str) -> str.startsWith("hoho"), () -> 300)
      .elsef(() -> null)
      .eval("mogemoge");
    Assertions.assertTrue(result.isEmpty());
  }
}

Recommended Posts

Essayez une expression If en Java
Deuxième décoction: essayez une expression If en Java
Comment résoudre les problèmes d'expression en Java
Essayez d'utiliser RocksDB avec Java
Essayez d'appeler JavaScript en Java
Essayez de développer Spresense avec Java (1)
Essayez le type fonctionnel en Java! ①
J'ai envoyé un e-mail en Java
Essayez d'implémenter Android Hilt en Java
Essayez d'exécuter Selenuim 3.141.59 avec eclipse (java)
J'ai fait une annotation en Java.
Essayez d'exécuter AWS X-Ray en Java
Essayez d'implémenter Yuma en Java
Exécuter un processus externe en Java
Essayez de résoudre Project Euler en Java
Essayez d'implémenter l'ajout n-aire en Java
Essayez d'utiliser l'API Stream en Java
Mapper sans utiliser de tableau en java
Essayez d'utiliser l'API au format JSON en Java
Essayez d'appeler le service CORBA sur Java 11+
Créons une application de calcul avec Java
Partition en Java
Changements dans Java 11
Janken à Java
[Java] Expression Lambda
Je veux ForEach un tableau avec une expression Lambda en Java
Taux circonférentiel à Java
Essayez grossièrement Java 9
Expression lambda Java
FizzBuzz en Java
Je souhaite envoyer un e-mail en Java.
Essayez de gratter environ 30 lignes en Java (sortie CSV)
Essayez de créer un babillard en Java
Essayez d'utiliser Sourcetrail (version win) avec du code Java
Essayez d'utiliser l'API Cloud Vision de GCP en Java
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
Essayez d'ajouter du texte à une image avec Scala en utilisant la bibliothèque standard de Java
Lire JSON en Java
Implémentation de l'interpréteur par Java
Faites un blackjack avec Java
Essayez d'appeler des méthodes synchronisées à partir de plusieurs threads en Java
Application Janken en Java
Programmation par contraintes en Java
Mettez java8 dans centos7
Omission des crochets du milieu dans l'instruction if (Java Silver)
Joindre des tableaux en Java
"Hello World" en Java
Interface appelable en Java
apprentissage java (expression conditionnelle)
expression 1 de la table lambda neutre java
J'ai écrit sur Java downcast d'une manière facile à comprendre
[java] Lancer une exception
Il est tard! Essayez d'implémenter la notification Android en Java (débutant)
Commentaires dans la source Java
Fonctions Azure en Java
Essayez LetCode dans Ruby-TwoSum
Formater XML en Java
Simple htmlspecialchars en Java