[JAVA] Schreiben Sie eine dritte If-Anweisung, die weder eine if-Anweisung noch ein ternärer Operator ist

Ich weiß nicht, wovon du sprichst, aber ich werde es richtig erklären.

Wenn ich diese Art von Code schreiben muss, bekomme ich Falten zwischen meinen Augenbrauen.

python


String s = null;
if (testSomeCond()) {
    s = "is true";
} else {
    s = "is false";
}
doSomething(s);

Der ternäre Operator ist in solchen Fällen nützlich.

python


String s = testSomeCond() ? "is true" : "is false";
doSomething(s);

Sie können so schreiben.

Dieser ternäre Operator ist oft umstritten, ob er gut oder schlecht ist, und er ist in der Go-Sprache vollständig abgeschnitten. Persönlich mag ich den ternären Operator, aber ich finde es schwierig zu lesen, wenn die Bedingung und der Rückgabewertteil lang sind.

Wie wäre es also so zu schreiben?

python


String s = If.correct(testSomeCond()).then("is true").orElse("is false");
doSomething(s);

Denken Sie nicht, dass dieser "Wenn-Satz" den Prozess so verstehen kann, als würden Sie normal Englisch lesen? Auch wenn der Zustand und der Rückgabewert etwas länger werden, wird die Lesbarkeit nicht so stark beeinträchtigt.

python


String s = If.correct(testSooooooooooooooooooooooooooooooooomething())
        .then("is trueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
        .orElse("is falseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
doSomething(s);

Das Obige führt natürlich zu einem Kompilierungsfehler. Fügen Sie daher die folgenden 3 Klassen hinzu, wenn Sie es verwenden. (Es wird nur Java 8 und höher unterstützt.)

python


public class If {
    public static BoolSaver correct(Boolean b) {
        return () -> b;
    }
}

@FunctionalInterface
public interface BoolSaver {
    Boolean get();

    default <A> Else<A> then(A a1) {
        return (A a2) -> get() ? a1 : a2;
    }
}

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

Ich habe ein Beispiel oder einen Github hochgeladen. Schauen Sie also bitte vorbei, wenn Sie interessiert sind. https://github.com/mt-village/nagare


Unten Nachschrift

python


int[] a = {1,2};
int i = 3;
int result = If.correct(i < a.length).then(a[i]).orElse(-1);

Ich habe einige Änderungen vorgenommen, um das Problem zu lösen, dass eine Ausnahme (ArrayIndexOutOfBoundsException) auftritt, obwohl ein [i] in einem Muster wie diesem nicht tatsächlich verwendet wird.

python


int[] a = {1,2};
int i = 3;
//Normales Schreiben
int a = If.correct(i < a.length).then(a.length).orElse(i);
//So schreiben Sie, wann einer der Rückgabewerte eine Ausnahme auslösen kann
int b = If.correct(i < a.length)
    .then(() -> a[i])
    .orElse(() -> -1);

Aktiviert, um den Lieferanten als Argument zu verwenden. Unter Sicherheitsgesichtspunkten denke ich, dass es besser ist, nur den Lieferanten zu verwenden, aber unter dem Gesichtspunkt der Verbesserung der Lesbarkeit, was der ursprüngliche Zweck ist, habe ich es möglich gemacht, beides zu tun.

Um die obige Schreibmethode zu aktivieren, müssen 1 Klasse und 4 Klassen hinzugefügt werden.

python


public class If {
    public static BoolSaver correct(Boolean b) {
        return () -> b;
    }
}

@FunctionalInterface
public interface BoolSaver {
    Boolean get();

    default <A> Else<A> then(A a1) {
        return (A a2) -> get() ?  a1 : a2;
    }

    default <A> ElseSaver<A> then(Supplier<A> a1) {
        return (Supplier<A> a2) -> get() ? a1.get() : a2.get();
    }
}

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

@FunctionalInterface
public interface ElseSaver<A> {
    A orElse(Supplier<A> a2);
}

Vielen Dank für den Hinweis auf @ saka1029!

Recommended Posts

Schreiben Sie eine dritte If-Anweisung, die weder eine if-Anweisung noch ein ternärer Operator ist
[Java] Bedingte Verzweigung ist eine if-Anweisung, es gibt jedoch auch einen bedingten Operator.
Wie schreibe ich eine if-Anweisung, um die Lesbarkeit von Java zu verbessern?
Was ist ein Operator?
Ist der ternäre Operator schlecht?
Schreiben wir einen Code, der einfach zu pflegen ist (Teil 2)