J'ai essayé de faire coexister Java Optional et la clause de garde

Le problème est que Java SE 8 Optional est incompatible avec la clause de garde, Je me suis demandé si cela pouvait coexister avec la clause de garde.

package com.ikemo3;

import java.util.Optional;

public class Main {

    public static void main(String[] args) {
        System.out.println(Main.sqrt("16"));
        System.out.println(Main.sqrt("-16"));
        System.out.println(Main.sqrt("str"));
    }

    public static String sqrt(String str) {
        return Optionals.of(str, String.class)
                .guard((s) -> toInteger(s), () -> "Pas un entier")
                .guard((i) -> sqrt(i), () -> "Pas un nombre positif")
                .get((d) -> String.valueOf(d));
    }

    /**
     *Si la valeur est positive, faites-en un entier
     */
    public static Optional<Integer> toInteger(String str) {
        try {
            return Optional.of(Integer.valueOf(str));
        } catch (NumberFormatException e) {
            return Optional.empty();
        }
    }

    /**
     *Si la valeur est positive, prenez la racine carrée
     */
    public static Optional<Double> sqrt(int i) {
        if (i >= 0) {
            return Optional.of(Math.sqrt(i));
        } else {
            return Optional.empty();
        }
    }
}

Le résultat de sortie est le suivant.

4.0
Pas un nombre positif
Pas un entier

Comment appeler est comme ça. Je me demande si cela ressemble à une clause de garde.

    public static String sqrt(String str) {
        return Optionals.of(str, String.class)
                .guard((s) -> toInteger(s), () -> "Pas un entier")
                .guard((i) -> sqrt(i), () -> "Pas un nombre positif")
                .get((d) -> String.valueOf(d));
    }

L'implémentation de la classe est la suivante.

package com.ikemo3;

import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;

public class Optionals<IN, RET> {
    private final IN value;
    private final RET elseValue;
    private final Class<RET> clazz;

    public static <IN, OUT> Optionals<IN, OUT> of(IN value, Class<OUT> clazz) {
        return new Optionals(value, clazz);
    }

    private Optionals(IN value, Class<RET> clazz) {
        this.value = value;
        this.clazz = clazz;
        this.elseValue = null;
    }

    private Optionals(RET elseValue) {
        this.value = null;
        this.clazz = null;
        this.elseValue = elseValue;
    }

    public <OUT> Optionals<OUT, RET> guard(Function<IN, Optional<OUT>> func, Supplier<RET> elseValue) {
        if (this.elseValue != null) {
            return new Optionals(this.elseValue);
        }

        Optional<OUT> result = func.apply(this.value);
        if (result.isPresent()) {
            return Optionals.of(result.get(), this.clazz);
        } else {
            return new Optionals(elseValue.get());
        }
    }

    public RET get(Function<IN, RET> func) {
        if (this.elseValue != null) {
            return this.elseValue;
        } else {
            return func.apply(this.value);
        }
    }
}

Recommended Posts

J'ai essayé de faire coexister Java Optional et la clause de garde
J'ai essayé de résumer les bases de kotlin et java
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
J'ai essayé d'interagir avec Java
J'ai essayé de résumer l'apprentissage Java (1)
J'ai créé un client RESAS-API en Java
J'ai essayé de résumer Java 8 maintenant
Facile à créer LINE BOT avec Java Servlet Partie 2: J'ai essayé des messages image et des modèles
J'ai essayé de créer une application Android avec MVC maintenant (Java)
J'ai essayé de résumer les méthodes de Java String et StringBuilder
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé de résumer les expressions Java lambda
J'ai essayé de créer mon propre guide de transfert en utilisant OpenTrip Planner et GTFS
J'ai créé un bot de transaction d'arbitrage de monnaie virtuelle et essayé de gagner de l'argent
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
java j'ai essayé de casser un simple bloc
J'ai essayé de lier grafana et postgres [docker-compose]
Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
J'ai essayé de lier JavaFX et Spring Framework.
J'ai essayé de créer une compétence Alexa avec Java
J'ai essayé de casser le bloc avec java (1)
Une histoire où j'ai essayé de faire une vidéo en liant Traitement et Resolume
[Petite histoire] J'ai essayé de rendre java ArrayList un peu plus pratique
Essayé l'API Toot et Streaming de Mastodon en Java
J'ai essayé de lire et de sortir CSV avec Outsystems
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
J'ai essayé d'implémenter la notification push Firebase en Java
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
[Java] J'ai essayé de résoudre le problème de rang B de Paiza
J'ai essayé de faire fonctionner SQS en utilisant AWS Java SDK
# 2 [Note] J'ai essayé de calculer quatre-vingt-dix-neuf avec Java.
J'ai démarré MySQL 5.7 avec docker-compose et j'ai essayé de me connecter
J'ai essayé d'intégrer le bouton AWS I oT et Slack
J'ai essayé de créer une compétence Clova en Java
J'ai essayé d'implémenter Sterling Sort avec Java Collector
Je veux faire des transitions d'écran avec kotlin et java!
[Java] J'ai essayé de mettre en œuvre la recherche de produits de l'API Yahoo
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
~ J'ai essayé d'apprendre la programmation fonctionnelle avec Java maintenant ~
J'avais l'habitude de faire nc (netcat) avec JAVA normalement
J'ai essayé de mâcher C # (lire et écrire des fichiers)
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé de moderniser une application Java EE avec OpenShift.
Java - Comment créer JTable
J'ai essayé de collecter et de résoudre les problèmes liés à la «classe» de Ruby.
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
Comment utiliser java Facultatif
J'ai essayé de vérifier ceci et celui de Spring @ Transactional
Je voulais juste créer une propriété réactive en Java
J'ai essayé Drools (Java, InputStream)
J'ai essayé de résumer les applications et les outils de développement personnellement utiles (outils de développement)
[Java] J'ai essayé le modificateur d'accès public et l'accès au champ non spécifié [Eclipse]