Dieser Artikel wurde impulsiv unter dem Einfluss dieses Artikels erstellt. 4-jährige Tochter "Daddy, benutze nur const?"
Magst du Java, alle?
Ich mochte es bis vor kurzem nicht sehr, aber heutzutage mag ich es sehr.
Es gibt viele Bibliotheken, moderne Syntax und Syntaxzucker.
Ich kann jedoch nicht akzeptieren, dass es keinen If-Ausdruck gibt, also habe ich so etwas gemacht.
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);
}
}
}
Eine Klasse, die einen T-Parameter als Argument verwendet, überprüft und einen Wert zurückgibt, der "Optional
Ich habe ein Beispiel als Test geschrieben.
class IffTest {
@Test
public void testIf() {
//String auswerten und Integer zurückgeben
var result = new Iff<String, Integer>((str) -> str.startsWith("hoge"), () -> 100).eval("hogeFuga");
Assertions.assertEquals(result.get(), 100);
}
@Test
public void testIfElseFirstMatch() {
//Mit der elseIf-Methode können Sie elseIf beliebig oft hinzufügen.
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)
//Sie können das Verhalten im Fall von else mit der elsef-Methode festlegen
.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());
//Wenn keiner der Ausdrücke übereinstimmt, wird Empty zurückgegeben
result.ifPresentOrElse(v -> {
Assertions.fail();
}, () -> {
//Wenn es anders ist, ist die Antwort richtig
});
}
@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