增强型switch语句是否可以进行多次赋值?

Can there be multiple value assignments for the enhanced switch statement?

我正在尝试使用增强型 switch 语句初始化两个变量:

int num = //something

boolean val1;
String val2;

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

这可能吗?

简短回答,不,据我所知,java 不支持任何方式的多重赋值。 解决方法是在 中构建一个容器 class 来存储字符串和布尔值。

示例

class Response 
{
    String message;
    boolean found;
}

和return一个包含两者的对象。

或者您可以使用数组和类型转换,或不同结构的语句。


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

Java 中没有元组解包。仍然使用 switch 表达式的快速替代方法可以使用自定义 class(在以下示例中使用 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();

因为你已经在 Java-13,我建议不要使用额外的库来表示元组并使用 Map.entry(在 Java-9 中引入) 与推断的局部变量类型 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();

将两个变量的初始化塞进一个语句中不一定有好处。比较

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 :/"; }
};

但如果你不喜欢我也不会感到惊讶。对于这个具体的例子,它也可以只使用

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