Cet article a été créé impulsivement sous l'influence de cet article. Fille de 4 ans "Papa, utilise seulement const?"
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.
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 
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