Versuchen Sie einen If-Ausdruck in Java

Vorwort

Dieser Artikel wurde impulsiv unter dem Einfluss dieses Artikels erstellt. 4-jährige Tochter "Daddy, benutze nur const?"

Text

Magst du Java, alle?

Ich mochte es bis vor kurzem nicht sehr, aber heutzutage mag ich es sehr.

Es gibt viele Bibliotheken, moderne Syntax und Syntaxzucker.

Ich kann jedoch nicht akzeptieren, dass es keinen If-Ausdruck gibt, also habe ich so etwas gemacht.

Fertiges Produkt

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);
    }
  }
}

Eine Klasse, die einen T-Parameter als Argument verwendet, überprüft und einen Wert zurückgibt, der "Optional " ist (dies ist wirklich ein if-Ausdruck ...?)

Wie benutzt man

Ich habe ein Beispiel als Test geschrieben.


class IffTest {

  @Test
  public void testIf() {
    //String auswerten und Integer zurückgeben
    var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100).eval("hogeFuga");
    Assertions.assertEquals(result.get(), 100);
  }

  @Test
  public void testIfElseFirstMatch() {
    //Mit der elseIf-Methode können Sie elseIf beliebig oft hinzufügen.
    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)
      //Sie können das Verhalten im Fall von else mit der elsef-Methode festlegen
      .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());
    //Wenn keiner der Ausdrücke übereinstimmt, wird Empty zurückgegeben
    result.ifPresentOrElse(v -> {
      Assertions.fail();
    }, () -> {
      //Wenn es anders ist, ist die Antwort richtig
    });
  }

  @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

Versuchen Sie einen If-Ausdruck in Java
Zweite Abkochung: Versuchen Sie einen If-Ausdruck in Java
So lösen Sie Ausdrucksprobleme in Java
Versuchen Sie es mit RocksDB mit Java
Versuchen Sie, JavaScript in Java aufzurufen
Lassen Sie uns Spresense mit Java entwickeln (1)
Probieren Sie den Funktionstyp in Java aus! ①
Ich habe eine E-Mail in Java gesendet
Versuchen Sie, Android Hilt in Java zu implementieren
Versuchen Sie, Selenuim 3.141.59 mit Eclipse (Java) auszuführen.
Ich habe eine Anmerkung in Java gemacht.
Versuchen Sie, AWS X-Ray in Java auszuführen
Versuchen Sie, Yuma in Java zu implementieren
Führen Sie einen externen Prozess in Java aus
Versuchen Sie, Project Euler in Java zu lösen
Versuchen Sie, n-ary Addition in Java zu implementieren
Versuchen Sie es mit der Stream-API in Java
Map ohne Verwendung eines Arrays in Java
Versuchen Sie es mit der JSON-Format-API in Java
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen
Lassen Sie uns eine Taschenrechner-App mit Java erstellen
Partisierung in Java
Änderungen in Java 11
Janken in Java
[Java] Lambda-Ausdruck
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
Umfangsrate in Java
Versuchen Sie es mit Java 9
Java Lambda Ausdruck
FizzBuzz in Java
Ich möchte eine E-Mail in Java senden.
Versuchen Sie, etwa 30 Zeilen in Java zu kratzen (CSV-Ausgabe)
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Versuchen Sie es mit Sourcetrail (Win-Version) mit Java-Code
Versuchen Sie, die Cloud Vision-API von GCP in Java zu verwenden
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
Versuchen Sie, mit Scala mithilfe der Standardbibliothek von Java Text zu einem Bild hinzuzufügen
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Machen Sie einen Blackjack mit Java
Versuchen Sie, synchronisierte Methoden aus mehreren Threads in Java aufzurufen
Janken App in Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
Weglassen der mittleren Klammern in der if-Anweisung (Java Silver)
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Aufrufbare Schnittstelle in Java
Java-Lernen (bedingter Ausdruck)
Java Neutral Lambda Tabellenausdruck 1
Ich habe leicht verständlich über Java Downcast geschrieben
[Java] Wirf eine Ausnahme aus
Es ist spät! Versuchen Sie, Android Notification in Java (Anfänger) zu implementieren.
Kommentare in der Java-Quelle
Azure funktioniert in Java
Versuchen Sie LetCode in Ruby-TwoSum
Formatieren Sie XML in Java
Einfache HTML-Spezialchars in Java