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