[JAVA] Ecrire une troisième instruction If qui n'est ni une instruction if ni un opérateur ternaire

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

Ecrire une troisième instruction If qui n'est ni une instruction if ni un opérateur ternaire
[Java] Le branchement conditionnel est une instruction if, mais il existe également un opérateur conditionnel.
Comment écrire une instruction if pour améliorer la lisibilité-java
Qu'est-ce qu'un opérateur?
L'opérateur ternaire est-il mauvais?
Écrivons un code facile à maintenir (Partie 2) Nom