5

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

int num = //something

boolean val1;
String val2;

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

这可能吗?

4

4 回答 4

5

由于您已经在使用 Java-13,因此我建议不要使用附加库来表示元组,并使用(在 Java-9 中引入)推断出Map.entry的局部变量类型的语法糖。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();
于 2020-02-12T02:58:48.443 回答
4

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

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 :/");
于 2020-02-12T15:33:39.517 回答
3

Java 中没有元组解包。仍然使用 switch 表达式的快速替代方法可以使用自定义类(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();
于 2020-02-12T00:20:01.190 回答
1

简短的回答,不,据我所知,java 不以任何方式支持多重分配。一种解决方法可能是在女巫中构建一个容器类来存储字符串和布尔值。

例子

class Response 
{
    String message;
    boolean found;
}

并返回一个包含两者的对象。

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


switch(num) {
    case 0: 
        val1 = true;
        val2 = "zero!"
        break;
    case 1: 
        val1 = true;
        val2 = "one!"
        break;
    default: 
        val1 = false;
        val2 = "unknown :/"
        break;
}
于 2020-02-12T00:14:03.627 回答