Deuxième décoction: essayez une expression If en Java

La deuxième décoction de "Try If expression en Java".

Ce qui peut être réalisé

Par exemple, vous pouvez écrire FizzBuzz comme suit:

    public static void main(String... args) {
        for (int i = 1; i <= 100; ++i) {
            int count = i;
            String fizzBuzzed = 
                    If.<String>test(() -> count % 15 == 0).then(() -> "FizzBuzz")
                    .elif(() -> count % 3 == 0).then(() -> "Fizz")
                    .elif(() -> count % 5 == 0).then(() -> "Buzz")
                    .el(() -> Integer.toString(count));
            System.out.println(fizzBuzzed);
        }
    }

Préparation

Parce qu'il gère une valeur Nullable comme valeur de l'expression if Créez la classe générique suivante.

import java.util.function.Supplier;

/**
 *null peut également être considéré comme une valeur{@link java.util.Optional}。
 * 
 *Les méthodes non utilisées cette fois sont omises.
 */
public class MayBe<T> {

    /**
     *Créez une instance où la valeur existe.
     */
    public static <R> MayBe<R> of(R result) {
        return new MayBe<>(true, result);
    }

    /**
     *Créez une instance sans valeur.
     */
    public static <R> MayBe<R> empty() {
        return new MayBe<>(false, null);
    }

    private final boolean isPresent;
    private final T value;

    private MayBe(boolean isPresent, T value) {
        this.isPresent = isPresent;
        this.value = value;
    }

    /**
     *Renvoie si la valeur existe.
     */
    public boolean isPresent() {
        return this.isPresent;
    }

    /**
     *Si la valeur existe, il la renvoie, sinon elle renvoie la valeur obtenue à partir de l'argument autre.
     */
    public T orElseGet(Supplier<T> other) {
        return isPresent() ? this.value : other.get();
    }
}

Production

import java.util.function.BooleanSupplier;
import java.util.function.Supplier;

public class If<R> {

    public static <R> If<R> test(BooleanSupplier predicate) {
        return new If<>(predicate, null);
    }

    private final If<R> prev;
    private final BooleanSupplier predicate;

    private Then<R> then = null;

    /**
     * @prédicat param Prédicat de ce si.
     * @param prev Si this if est else if, le if précédent.
     *Sinon, nul.
     */
    private If(BooleanSupplier predicate, If<R> prev) {
        this.prev = prev;
        this.predicate = predicate;
    }

    public Then<R> then(Supplier<R> valueSupplier) {
        if (this.then != null) {
            throw new IllegalStateException("`then`A déjà été appelé.");
        }

        return this.then = new Then<>(this, valueSupplier);
    }

    /**
     *Évaluez jusqu'à cela si.
     * 
     * @return La valeur du résultat de l'évaluation.
     */
    private MayBe<R> eval() {
        if (this.then == null) {
            throw new IllegalStateException("`then`N'a pas encore été appelé.");
        }

        if (this.prev != null) {
            MayBe<R> prevValue = this.prev.eval();
            if (prevValue.isPresent()) {
                return prevValue;
            }
        }

        return this.predicate.getAsBoolean()
                ? MayBe.of(this.then.getThenValue())
                : MayBe.empty();
    }

    /**
     * {@link If#then}La classe d'objets renvoyée par.
     */
    public static class Then<R> {
        private final If<R> relatedIf;
        private final Supplier<R> thenValueSupplier;

        /**
         * @param relatedIf Ceci alors si.
         * @param valueSupplier La valeur à renvoyer si this then if est vrai.
         */
        Then(If<R> relatedIf, Supplier<R> valueSupplier) {
            this.relatedIf = relatedIf;
            this.thenValueSupplier = valueSupplier;
        }

        public If<R> elif(BooleanSupplier predicate) {
            return new If<>(predicate, this.relatedIf);
        }

        public R el(Supplier<R> valueSupplier) {
            return this.relatedIf.eval().orElseGet(valueSupplier);
        }

        /**
         *Renvoie la valeur si this then if est vrai.
         */
        R getThenValue() {
            return this.thenValueSupplier.get();
        }
    }
}

traits

--Seuls les prédicats if sont évalués. --Seules ceux qui ont besoin d'obtenir la valeur sont évalués.

Impressions

C'est plus facile à lire si c'est comme une fonction immédiate en JavaScript.

    public static void main(String... args) {
        for (int i = 1; i <= 100; ++i) {
            int count = i;
            String fizzBuzzed = ((Supplier<String>) () -> {
                if (count % 15 == 0) return "FizzBuzz";
                else if (count % 3 == 0) return "Fizz";
                else if (count % 5 == 0) return "Buzz";
                else return Integer.toString(count);
            }).get();
            System.out.println(fizzBuzzed);
        }
    }

/c'est tout

Recommended Posts

Deuxième décoction: essayez une expression If en Java
Essayez une expression If en Java
Comment résoudre les problèmes d'expression en Java
Essayez d'utiliser RocksDB avec Java
Essayez d'appeler JavaScript en Java
Essayez de développer Spresense avec Java (1)
Essayez le type fonctionnel en Java! ①
J'ai envoyé un e-mail en Java
Essayez d'implémenter Android Hilt en Java
Essayez d'exécuter Selenuim 3.141.59 avec eclipse (java)
J'ai fait une annotation en Java.
Essayez d'exécuter AWS X-Ray en Java
Essayez d'implémenter Yuma en Java
Exécuter un processus externe en Java
Essayez de résoudre Project Euler en Java
Essayez d'implémenter l'ajout n-aire en Java
Essayez d'utiliser l'API Stream en Java
Mapper sans utiliser de tableau en java
Essayez d'utiliser l'API au format JSON en Java
Essayez d'appeler le service CORBA sur Java 11+
Créons une application de calcul avec Java
Je veux ForEach un tableau avec une expression Lambda en Java
Essayez d'ajouter du texte à une image avec Scala en utilisant la bibliothèque standard de Java
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (deuxième décoction Javassist)
Soyez prudent si vous trouvez SHIFT-JIS en Java
Je souhaite envoyer un e-mail en Java.
Essayez de gratter environ 30 lignes en Java (sortie CSV)
Essayez d'utiliser Sourcetrail (version win) avec du code Java
Essayez d'utiliser l'API Cloud Vision de GCP en Java
Essayez d'utiliser Sourcetrail (version macOS) avec du code Java
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
Partition en Java
Essayez Java 8 Stream
Janken à Java
[Java] Expression Lambda
Taux circonférentiel à Java
Essayez grossièrement Java 9
Expression lambda Java
FizzBuzz en Java
Omission des crochets du milieu dans l'instruction if (Java Silver)
J'ai écrit sur Java downcast d'une manière facile à comprendre
Il est tard! Essayez d'implémenter la notification Android en Java (débutant)
N'écrivez pas de code si (isAdmin == true) en Java
Essayez de faire un programme d'addition en plusieurs langues
Implémentez rapidement singleton avec enum en Java
Sortie true avec if (a == 1 && a == 2 && a == 3) en Java (identifiant invisible)
J'ai essayé d'utiliser l'instruction Extended for en Java
Essayez le hooking global en Java à l'aide de la bibliothèque JNativeHook
Essayez de résoudre un problème FizzBuzz restreint en Java