[JAVA] Bedingte Verzweigung mit fließender Schnittstelle

Annahme

Bedingte Verzweigung in Frage

Diese Art der Verarbeitung, die Sie oft sehen.

//Wenn die Zeichenfolge nicht leer ist und niedrigere Alphabete enthält
//Und
//Wenn die Verarbeitungskategorie entweder registriert oder geändert wird
if ((StringUtils.isNotEmpty(str) && StringUtils.isAlpha(str)
        && StringUtils.isAllLowerCase(str))
        && (processDivision.isRegister() || processDivision.isChange())) {
    //Etwas zu verarbeiten
}

Auf einen Blick ist es schwer zu sagen, wie die Bedingungen sind, und es ist leicht, Fehler in der Position von Klammern zu machen. Auf diesem Niveau mag es noch besser sein, aber ich werde verzweifeln, wenn die Bedingungen steigen ...

Gelöst mit einer Flüssigkeitsschnittstelle

Erstellen Sie die folgende Klasse.

Assume.java


public final class Assume<T> {

    private T obj;

    public static <T> Assume<T> that(T obj) {

        Assume<T> assume = new Assume<>();
        assume.obj = obj;

        return assume;
    }

    public AnyMatch<T> satisfiesAnyOf(Predicate<T> method) {

        AnyMatch<T> anyOf = new AnyMatch<>(obj, method);

        return anyOf;

    }

    public AllMatch<T> satisfiesAllOf(Predicate<T> method) {

        AllMatch<T> allOf = new AllMatch<>(obj, method);

        return allOf;

    }

}

AnyMatch.java


public final class AnyMatch<T> {

    private T obj;

    private boolean match;

    protected AnyMatch(T obj, Predicate<T> checkMethod) {
        this.match = checkMethod.test(obj);
        this.obj = obj;
    }

    public AnyMatch<T> or(Predicate<T> checkMethod) {

        if (match) {
            return this;
        }

        this.match = checkMethod.test(obj);
        return this;
    }

    public boolean check() {

        return match;
    }
}

AllMatch.java


public class AllMatch<T> {

    private T obj;

    private boolean match;

    protected AllMatch(T obj, Predicate<T> checkMethod) {
        this.match = checkMethod.test(obj);
        this.obj = obj;
    }

    public AllMatch<T> and(Predicate<T> checkMethod) {

        if (!match) {
            return this;
        }

        this.match = checkMethod.test(obj);
        return this;
    }

    public boolean check() {
        return match;
    }

}

Mit diesen drei kann der Prozess am Anfang wie folgt geschrieben werden.

//Wenn die Zeichenfolge nicht leer ist und niedrigere Alphabete enthält
//Und
//Wenn die Verarbeitungskategorie entweder registriert oder geändert wird
if (Assume.that(str)
        .satisfiesAllOf(StringUtils::isNotEmpty)
        .and(StringUtils::isAlpha)
        .and(StringUtils::isAllLowerCase).check()
        && Assume.that(processDivision)
                 .satisfiesAnyOf(ProcessDivision::isRegister)
                 .or(ProcessDivision::isChange).check()) {
    //Etwas zu verarbeiten
}

Die Beschreibung ist länger, aber es ist einfacher zu verstehen, was Sie tun. Sollte sein.

Weitere Verbesserung

Schreiben Sie eine dritte If-Anweisung, die weder eine if-Anweisung noch ein ternärer Operator ist Weitere Verbesserung in Bezug auf den Artikel in.

AnyMatch.java


public final class AnyMatch<T> {
    
    ...

    public <A> Else<A> then(Supplier<A> a1) {
        return (Supplier<A> a2) -> match ? a1.get() : a2.get();
    }
}

Hinzufügen,

Else.java


public interface Else<A> {
    A orElse(Supplier<A> a2);
}

Wenn Sie sich vorbereiten

String hoge = Assume.that(str)
        .satisfiesAllOf(StringUtils::isNotEmpty)
        .and(StringUtils::isAlpha)
        .and(StringUtils::isAllLowerCase).then(() -> "aaa").orElse(() -> "bbb");

Sie können dies auch tun.

Referenz

Recommended Posts

Bedingte Verzweigung mit fließender Schnittstelle
Ausnahmebehandlung mit einer Fluidschnittstelle
Erstellen Sie Ausnahmen mit einer Fluid-Schnittstelle
Realisieren Sie eine Entscheidungstabelle ohne bedingte Verzweigung
Viel Spaß beim Programmieren mit Lambda-Stil und flüssiger Oberfläche
Eine Geschichte, die von String () von Interface abhängig ist und von JdkDynamicAopProxy vertreten wird
Eine verwirrte Geschichte über einen ternären Operator mit mehreren bedingten Ausdrücken
Erstellen Sie einen Spielplatz mit Xcode 12
Java (bedingte Verzweigung und Wiederholung)
Bedingte Verzweigung mit Hilfsmethode
Eine Geschichte, die bei NotSerializableException steckt
Ich habe mit JD-Core eine Befehlszeilenschnittstelle mit dem WinMerge Plugin erstellt