Оператор переключения Java несколько случаев - PullRequest
100 голосов
/ 23 февраля 2011

Просто пытаюсь понять, как использовать многократные случаи для оператора переключения Java. Вот пример того, что я пытаюсь сделать:

switch (variable)
{
    case 5..100:
        doSomething();
    break;
}

против необходимости:

switch (variable)
{
    case 5:
    case 6:
    etc.
    case 100:
        doSomething();
    break;
}

Есть идеи, если это возможно, или какая хорошая альтернатива?

Ответы [ 12 ]

1 голос
/ 19 сентября 2017

С этим можно справиться, используя 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.

Подробнее см. Официальная документация .

0 голосов
/ 14 мая 2019

Одной альтернативой вместо использования жестко закодированных значений может быть использование сопоставления диапазонов в операторе switch:

private static final int RANGE_5_100 = 1;
private static final int RANGE_101_1000 = 2;
private static final int RANGE_1001_10000 = 3;

public boolean handleRanges(int n) {
    int rangeCode = getRangeCode(n);
    switch (rangeCode) {
        case RANGE_5_100: // doSomething();
        case RANGE_101_1000: // doSomething();
        case RANGE_1001_10000: // doSomething();
        default: // invalid range
    }
}

private int getRangeCode(int n) {
    if (n >= 5 && n <= 100) {
        return RANGE_5_100;
    } else if (n >= 101 && n <= 1000) {
        return RANGE_101_1000;
    } else if (n >= 1001 && n <= 10000) {
        return RANGE_1001_10000;
    }

    return -1;
}
...