С этим можно справиться, используя Vavr library
import static io.vavr.API.*;
import static io.vavr.Predicates.*;
Match(variable).of(
Case($(isIn(5, 6, ... , 100)), () -> doSomething()),
Case($(), () -> handleCatchAllCase())
);
Это, конечно, лишь небольшое улучшение, поскольку все случаи по-прежнему должны быть указаны в явном виде. Но пользовательский предикат легко определить:
public static <T extends Comparable<T>> Predicate<T> isInRange(T lower, T upper) {
return x -> x.compareTo(lower) >= 0 && x.compareTo(upper) <= 0;
}
Match(variable).of(
Case($(isInRange(5, 100)), () -> doSomething()),
Case($(), () -> handleCatchAllCase())
);
Match - это выражение, поэтому здесь оно возвращает что-то вроде Runnable
instance вместо прямого вызова методов. После выполнения матча можно выполнить Runnable
.
Подробнее см. Официальная документация .