Zweite Abkochung: Versuchen Sie einen If-Ausdruck in Java

Die zweite Abkochung von "Try If-Ausdruck in Java".

Was kann erreicht werden

Sie können FizzBuzz beispielsweise wie folgt schreiben:

    public static void main(String... args) {
        for (int i = 1; i <= 100; ++i) {
            int count = i;
            String fizzBuzzed = 
                    If.<String>test(() -> count % 15 == 0).then(() -> "FizzBuzz")
                    .elif(() -> count % 3 == 0).then(() -> "Fizz")
                    .elif(() -> count % 5 == 0).then(() -> "Buzz")
                    .el(() -> Integer.toString(count));
            System.out.println(fizzBuzzed);
        }
    }

Vorbereitung

Weil es einen nullbaren Wert als Wert des if-Ausdrucks behandelt Erstellen Sie die folgende generische Klasse.

import java.util.function.Supplier;

/**
 *null kann auch als Wert genommen werden{@link java.util.Optional}。
 * 
 *Die diesmal nicht verwendeten Methoden werden weggelassen.
 */
public class MayBe<T> {

    /**
     *Erstellen Sie eine Instanz, in der der Wert vorhanden ist.
     */
    public static <R> MayBe<R> of(R result) {
        return new MayBe<>(true, result);
    }

    /**
     *Erstellen Sie eine Instanz ohne Wert.
     */
    public static <R> MayBe<R> empty() {
        return new MayBe<>(false, null);
    }

    private final boolean isPresent;
    private final T value;

    private MayBe(boolean isPresent, T value) {
        this.isPresent = isPresent;
        this.value = value;
    }

    /**
     *Gibt zurück, ob der Wert vorhanden ist.
     */
    public boolean isPresent() {
        return this.isPresent;
    }

    /**
     *Wenn der Wert vorhanden ist, wird er zurückgegeben, andernfalls wird der Wert zurückgegeben, der aus dem Argument other erhalten wurde.
     */
    public T orElseGet(Supplier<T> other) {
        return isPresent() ? this.value : other.get();
    }
}

Produktion

import java.util.function.BooleanSupplier;
import java.util.function.Supplier;

public class If<R> {

    public static <R> If<R> test(BooleanSupplier predicate) {
        return new If<>(predicate, null);
    }

    private final If<R> prev;
    private final BooleanSupplier predicate;

    private Then<R> then = null;

    /**
     * @param Prädikat Prädikat davon if.
     * @param prev Wenn dies if ist else if, das vorherige if.
     *Andernfalls null.
     */
    private If(BooleanSupplier predicate, If<R> prev) {
        this.prev = prev;
        this.predicate = predicate;
    }

    public Then<R> then(Supplier<R> valueSupplier) {
        if (this.then != null) {
            throw new IllegalStateException("`then`Wurde bereits angerufen.");
        }

        return this.then = new Then<>(this, valueSupplier);
    }

    /**
     *Bewerten Sie bis zu diesem Fall.
     * 
     * @return Der Wert des Bewertungsergebnisses.
     */
    private MayBe<R> eval() {
        if (this.then == null) {
            throw new IllegalStateException("`then`Wurde noch nicht angerufen.");
        }

        if (this.prev != null) {
            MayBe<R> prevValue = this.prev.eval();
            if (prevValue.isPresent()) {
                return prevValue;
            }
        }

        return this.predicate.getAsBoolean()
                ? MayBe.of(this.then.getThenValue())
                : MayBe.empty();
    }

    /**
     * {@link If#then}Die von zurückgegebene Objektklasse.
     */
    public static class Then<R> {
        private final If<R> relatedIf;
        private final Supplier<R> thenValueSupplier;

        /**
         * @param relatedWenn dies dann wenn.
         * @param valueSupplier Der Wert, der zurückgegeben werden soll, wenn dies der Fall ist.
         */
        Then(If<R> relatedIf, Supplier<R> valueSupplier) {
            this.relatedIf = relatedIf;
            this.thenValueSupplier = valueSupplier;
        }

        public If<R> elif(BooleanSupplier predicate) {
            return new If<>(predicate, this.relatedIf);
        }

        public R el(Supplier<R> valueSupplier) {
            return this.relatedIf.eval().orElseGet(valueSupplier);
        }

        /**
         *Gibt den Wert zurück, wenn dies der Fall ist.
         */
        R getThenValue() {
            return this.thenValueSupplier.get();
        }
    }
}

Eigenschaften

Impressionen

Es ist einfacher zu lesen, wenn es sich um eine Sofortfunktion in JavaScript handelt.

    public static void main(String... args) {
        for (int i = 1; i <= 100; ++i) {
            int count = i;
            String fizzBuzzed = ((Supplier<String>) () -> {
                if (count % 15 == 0) return "FizzBuzz";
                else if (count % 3 == 0) return "Fizz";
                else if (count % 5 == 0) return "Buzz";
                else return Integer.toString(count);
            }).get();
            System.out.println(fizzBuzzed);
        }
    }

/das ist alles

Recommended Posts

Zweite Abkochung: Versuchen Sie einen If-Ausdruck in Java
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
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
Versuchen Sie, mit Scala mithilfe der Standardbibliothek von Java Text zu einem Bild hinzuzufügen
Sogar in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Javassist zweite Abkochung)
Seien Sie vorsichtig, wenn Sie SHIFT-JIS in Java finden
Ich möchte eine E-Mail in Java senden.
Versuchen Sie, etwa 30 Zeilen in Java zu kratzen (CSV-Ausgabe)
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 Sourcetrail (MacOS-Version) mit Java-Code
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
Partisierung in Java
Probieren Sie Java 8 Stream aus
Janken in Java
[Java] Lambda-Ausdruck
Umfangsrate in Java
Versuchen Sie es mit Java 9
Java Lambda Ausdruck
FizzBuzz in Java
Weglassen der mittleren Klammern in der if-Anweisung (Java Silver)
Ich habe leicht verständlich über Java Downcast geschrieben
Es ist spät! Versuchen Sie, Android Notification in Java (Anfänger) zu implementieren.
Schreiben Sie keinen Code, wenn (isAdmin == true) in Java
Versuchen Sie, ein Zusatzprogramm in mehreren Sprachen zu erstellen
Implementieren Sie Singleton mit Enum schnell in Java
Ausgabe true mit if (a == 1 && a == 2 && a == 3) in Java (Invisible Identifier)
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Versuchen Sie es mit globalem Hooking in Java mithilfe der JNativeHook-Bibliothek
Versuchen Sie, ein eingeschränktes FizzBuzz-Problem in Java zu lösen