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