Je ne sais pas de quoi vous parlez, mais je vais vous l'expliquer correctement.
Quand je dois écrire ce genre de code, j'ai des rides entre mes sourcils.
python
String s = null;
if (testSomeCond()) {
s = "is true";
} else {
s = "is false";
}
doSomething(s);
L'opérateur ternaire est utile dans de tels cas.
python
String s = testSomeCond() ? "is true" : "is false";
doSomething(s);
Vous pouvez écrire comme ça.
Cet opérateur ternaire est souvent controversé sur sa lisibilité et sa mauvaise lisibilité, et il est complètement coupé dans le langage Go. Personnellement, j'aime bien l'opérateur ternaire, mais j'ai du mal à lire quand la condition et la valeur de retour sont longues.
Alors que diriez-vous d'écrire comme ça?
python
String s = If.correct(testSomeCond()).then("is true").orElse("is false");
doSomething(s);
Ne pensez-vous pas que cette «phrase Si» peut comprendre le processus comme si vous lisiez l'anglais normalement? De plus, même si la condition et la valeur de retour deviennent un peu plus longues, la lisibilité ne sera pas trop altérée.
python
String s = If.correct(testSooooooooooooooooooooooooooooooooomething())
.then("is trueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
.orElse("is falseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
doSomething(s);
Bien sûr, ce qui précède entraînera une erreur de compilation, alors ajoutez les 3 classes suivantes lors de son utilisation. (Seuls Java 8 et supérieur sont pris en charge)
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);
}
J'ai téléchargé un échantillon ou un github, alors jetez un œil si vous êtes intéressé. https://github.com/mt-village/nagare
Ci-dessous, post-scriptum
python
int[] a = {1,2};
int i = 3;
int result = If.correct(i < a.length).then(a[i]).orElse(-1);
J'ai fait quelques modifications pour résoudre le problème qu'une exception (ArrayIndexOutOfBoundsException) se produit même si un [i] n'est pas réellement utilisé dans un modèle comme celui-ci.
python
int[] a = {1,2};
int i = 3;
//Écriture normale
int a = If.correct(i < a.length).then(a.length).orElse(i);
//Comment écrire quand l'une des valeurs de retour peut déclencher une exception
int b = If.correct(i < a.length)
.then(() -> a[i])
.orElse(() -> -1);
Activé pour prendre le fournisseur comme argument. D'un point de vue sécurité, je pense qu'il vaut mieux n'utiliser que le Fournisseur, mais du point de vue de l'amélioration de la lisibilité, qui est l'objectif initial, j'ai permis de faire les deux.
Pour activer l'écriture ci-dessus, vous devez ajouter 1 classe et 4 classes.
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);
}
Merci d'avoir signalé @ saka1029!
Recommended Posts