Ich habe versucht, Java Optional und Guard-Klausel koexistieren zu lassen

Das Problem ist, dass Java SE 8 Optional nicht mit der Schutzklausel kompatibel ist. Ich fragte mich, ob es irgendwie mit der Schutzklausel koexistieren könnte.

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), () -> "Keine ganze Zahl")
                .guard((i) -> sqrt(i), () -> "Keine positive Zahl")
                .get((d) -> String.valueOf(d));
    }

    /**
     *Wenn der Wert positiv ist, machen Sie ihn zu einer Ganzzahl
     */
    public static Optional<Integer> toInteger(String str) {
        try {
            return Optional.of(Integer.valueOf(str));
        } catch (NumberFormatException e) {
            return Optional.empty();
        }
    }

    /**
     *Wenn der Wert positiv ist, ziehen Sie die Quadratwurzel
     */
    public static Optional<Double> sqrt(int i) {
        if (i >= 0) {
            return Optional.of(Math.sqrt(i));
        } else {
            return Optional.empty();
        }
    }
}

Das Ausgabeergebnis ist wie folgt.

4.0
Keine positive Zahl
Keine ganze Zahl

Wie man anruft ist so. Ich frage mich, ob es wie eine Schutzklausel aussieht.

    public static String sqrt(String str) {
        return Optionals.of(str, String.class)
                .guard((s) -> toInteger(s), () -> "Keine ganze Zahl")
                .guard((i) -> sqrt(i), () -> "Keine positive Zahl")
                .get((d) -> String.valueOf(d));
    }

Die Implementierung der Klasse ist wie folgt.

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

Ich habe versucht, Java Optional und Guard-Klausel koexistieren zu lassen
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe einen RESAS-API-Client in Java erstellt
Ich habe jetzt versucht, Java 8 zusammenzufassen
Einfacher LINE BOT mit Java Servlet Teil 2: Ich habe versucht, Bildnachrichten und Vorlagen zu erstellen
Ich habe versucht, eine Android-Anwendung mit MVC zu erstellen (Java)
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Ich habe versucht, mit OpenTrip Planner und GTFS eine eigene Übertragungsanleitung zu erstellen
Ich habe einen Arbitrage-Transaktionsbot für virtuelle Währungen erstellt und versucht, Geld zu verdienen
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe versucht, grafana und postgres [docker-compose] zu verknüpfen
Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe versucht, neunundneunzig in Java auszugeben
Ich habe versucht, JavaFX und Spring Framework zu verknüpfen.
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Ich habe versucht, den Block mit Java zu brechen (1)
Eine Geschichte, als ich versuchte, ein Video zu erstellen, indem ich Processing und Resolume verknüpfte
[Kleine Geschichte] Ich habe versucht, die Java-ArrayList etwas komfortabler zu gestalten
Versuchte Mastodons Toot- und Streaming-API in Java
Ich habe versucht, CSV mit Outsystems zu lesen und auszugeben
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
[Java 11] Ich habe versucht, Java auszuführen, ohne mit Javac zu kompilieren
[Java] Ich habe versucht, Paizas B-Rang-Problem zu lösen
Ich habe versucht, SQS mit AWS Java SDK zu betreiben
# 2 [Anmerkung] Ich habe versucht, neunundneunzig mit Java zu berechnen.
Ich habe MySQL 5.7 mit Docker-Compose gestartet und versucht, eine Verbindung herzustellen
Ich habe versucht, AWS I oT Button und Slack zu integrieren
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
~ Ich habe jetzt versucht, funktionale Programmierung mit Java zu lernen ~
Ich habe nc (netcat) normalerweise mit JAVA gemacht
Ich habe versucht, C # zu kauen (Dateien lesen und schreiben)
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
Java - So erstellen Sie JTable
Ich habe versucht, Rubys "Klassen" -Probleme zu sammeln und zu lösen.
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Verwendung von Java Optional
Ich habe versucht, dies und das von Spring @ Transactional zu überprüfen
Ich wollte nur eine reaktive Eigenschaft in Java erstellen
Ich habe Drools (Java, InputStream) ausprobiert.
Ich habe versucht, persönlich nützliche Apps und Entwicklungstools (Entwicklungstools) zusammenzufassen.
[Java] Ich habe versucht, den öffentlichen und nicht angegebenen Feldzugriffsmodifikator aufzurufen. [Eclipse]