91
3.2. Abstrakcja struktur sterujących
Listing 3.8. Dopasowywanie warunków za pomocą klasy Case
public class Case<T> extends Tuple<Supplier<Boolean>. Supplier<Result<T»>{
private Case(Supplier<Boolean> booleanSupplier.
Supplier<Result<T» resultSupplier) { super(booleanSupplier. resultSupplier):
public static <T> Case<T> mcase(Supplier<Boolean> condition.
Supplier<Result<T» value) { return new Case<>(condition. value):
{
Zapis () -> true to funkcja anonimowa reprezentująca Supplier<Boolean>, który zawsze zwróci wartość true. Innymi słowy, jest to „leniwe" true. Tego rodzaju leniwość nie ma dużego sensu dla literału, ale trzeba dostosować się do warunków stawianych konstruktorowi DefaultCase.
public static <T> DefaultCase<T> mcase(Supplier<Result<T» value) return new DefaultCase<>(() -> true. value): <-
private static class DefaultCase<T> extends Case<T> { private DefaultCase(Supplier<Boolean> booleanSupplier.
Supplier<Result<T» resultSupplier) { super(booleanSupplier. resultSupplier):
@SafeVarargs
public static <T> Result<T> match(DefaultCase<T> defaultCase.
Case<T>... matchers) { for (Case<T> aCase : matchers) {
if (aCase._l.get()) return aCase._2.get():
return defaultCase._2.get():