Может ли быть несколько назначений значений для расширенного оператора switch? - PullRequest
5 голосов
/ 12 февраля 2020

Я пытаюсь инициализировать две переменные с помощью расширенного оператора switch:

int num = //something

boolean val1;
String val2;

val1, val2 = switch(num) {
    case 0 -> (true, "zero!");
    case 1 -> (true, "one!");
    default -> (false, "unknown :/");
}

Возможно ли это?

Ответы [ 4 ]

5 голосов
/ 12 февраля 2020

Поскольку вы уже используете Java -13, я бы рекомендовал воздержаться от использования дополнительной библиотеки для представления кортежа и использовать Map.entry (введено в Java -9) с синтаксис c сахар типа локальной переменной var выведенный.

var entry = switch (num) {
    case 0 -> Map.entry(true, "zero!");
    case 1 -> Map.entry(true, "one!");
    default -> Map.entry(false, "unknown :/");
};
boolean val1 = entry.getKey();
String val2 = entry.getValue();
4 голосов
/ 12 февраля 2020

Нет необходимости извлекать выгоду из инициализации двух переменных в один оператор. Сравните с

var val1 = switch(num) { case 0, 1 -> true; default -> false; };
var val2 = switch(num) { case 0 -> "zero!"; case 1 -> "one!"; default -> "unknown :/"; };

Но для полноты новый синтаксис switch также разрешает присваивания:

boolean val1;
String val2;
switch(num) {
    case 0 -> { val1 = true; val2 = "zero!"; }
    case 1 -> { val1 = true; val2 = "one!"; }
    default -> { val1 = false; val2 = "unknown :/"; }
}

Вы также можете использовать форму выражения для предоставления инициализатора одной переменной и назначьте другой

boolean val1;
String val2 = switch(num) {
    case 0 -> { val1 = true; yield "zero!"; }
    case 1 -> { val1 = true; yield "one!"; }
    default -> { val1 = false; yield "unknown :/"; }
};

, но я не удивлюсь, если вам это не понравится. Для этого конкретного примера c будет также работать просто

var val2 = switch(num) { case 0 -> "zero!"; case 1 -> "one!"; default -> "unknown :/"; };
var val1 = !val2.equals("unknown :/");
3 голосов
/ 12 февраля 2020

В Java нет распаковки кортежей. Быстрая альтернатива, которая все еще использует выражение-переключатель, может использовать пользовательский класс (используя Pair в следующем примере):

Pair<Boolean, String> val = switch (num) {
    case 0 -> Pair.of(true, "zero!");
    case 1 -> Pair.of(true, "one!");
    default -> Pair.of(false, "unknown :/");
};

boolean val1 = val.getLeft();
String val2 = val.getRight();
1 голос
/ 12 февраля 2020

Короткий ответ, нет, java не поддерживает множественное назначение, насколько я знаю. Обходным путем может быть создание контейнерного класса в witch для хранения как строки, так и bool.

пример

class Response 
{
    String message;
    bool found;
}

и возврат объекта, содержащего оба.

Или потенциально Вы можете использовать приведение к массиву и типу, или оператор с другой структурой.


switch(num) {
    case 0: 
        val1 = true;
        val2 = "zero!"
        break;
    case 1: 
        val1 = true;
        val2 = "one!"
        break;
    default: 
        val1 = false;
        val2 = "unknown :/"
        break;
}
...