Cet article a été créé impulsivement sous l'influence de cet article. Fille de 4 ans "Papa, utilise seulement const?"
Aimez-vous Java, tout le monde?
Je ne l'aimais pas beaucoup jusqu'à récemment, mais aujourd'hui je l'aime beaucoup.
Il existe de nombreuses bibliothèques, une syntaxe moderne et un sucre de syntaxe.
Cependant, je ne peux pas accepter qu'il n'y ait pas d'expression If, alors j'ai fait quelque chose comme ça.
public class Iff<T, R> {
Map<Predicate<T>, Supplier<R>> evaluations = new LinkedHashMap<>();
private Supplier<R> elsef;
public Iff(Predicate<T> condition, Supplier<R> then) {
evaluations.put(condition, then);
}
public Iff<T, R> elseIf(Predicate<T> condition, Supplier<R> then) {
evaluations.put(condition, then);
return this;
}
public Iff<T, R> elsef(Supplier<R> elsef) {
this.elsef = elsef;
return this;
}
public Optional<R> eval(T target) {
for (Map.Entry<Predicate<T>, Supplier<R>> entry : this.evaluations.entrySet()) {
if (entry.getKey().test(target)) {
var value = entry.getValue().get();
return Objects.isNull(value) ? Optional.empty() : Optional.of(value);
}
}
if (this.elsef == null) {
return Optional.empty();
} else {
var result = this.elsef.get();
if (Objects.isNull(result)) {
return Optional.empty();
}
return Optional.of(result);
}
}
}
C'est une classe qui prend un paramètre T comme argument, le vérifie et renvoie une valeur de ʻOptional
J'ai écrit un échantillon comme test.
class IffTest {
@Test
public void testIf() {
//Évaluer la chaîne et renvoyer un entier
var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100).eval("hogeFuga");
Assertions.assertEquals(result.get(), 100);
}
@Test
public void testIfElseFirstMatch() {
//Vous pouvez ajouter elseIf autant de fois que vous le souhaitez avec la méthode elseIf.
var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100)
.elseIf((str) -> str.startsWith("hogeFuga"), () -> 200)
.elseIf((str) -> str.startsWith("hoho"), () -> 300)
.eval("hogeFuga");
Assertions.assertEquals(result.get(), 100);
}
@Test
public void noMatch() {
var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100)
.elseIf((str) -> str.startsWith("hogeFuga"), () -> 200)
.elseIf((str) -> str.startsWith("hoho"), () -> 300)
//Vous pouvez définir le comportement dans le cas de else avec la méthode elsef
.elsef(() -> 400)
.eval(UUID.randomUUID().toString());
Assertions.assertEquals(result.get(), 400);
}
@Test
public void noMatchNotExistsElse() {
var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100)
.elseIf((str) -> str.startsWith("hogeFuga"), () -> 200)
.elseIf((str) -> str.startsWith("hoho"), () -> 300)
.eval(UUID.randomUUID().toString());
//Si aucune des expressions ne correspond, Empty sera retourné
result.ifPresentOrElse(v -> {
Assertions.fail();
}, () -> {
//S'il en est autrement, la réponse est correcte
});
}
@Test
public void elseResultIsNull() {
var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100)
.elseIf((str) -> str.startsWith("hogeFuga"), () -> 200)
.elseIf((str) -> str.startsWith("hoho"), () -> 300)
.elsef(() -> null)
.eval(UUID.randomUUID().toString());
Assertions.assertTrue(result.isEmpty());
}
@Test
public void elseIfResultIsNull() {
var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100)
.elseIf((str) -> str.startsWith("mogemoge"), () -> null)
.elseIf((str) -> str.startsWith("hoho"), () -> 300)
.elsef(() -> null)
.eval("mogemoge");
Assertions.assertTrue(result.isEmpty());
}
}
Recommended Posts