这个功能会被放到后面的Java版本中吗?
有人能解释一下为什么我不能这样做,比如,Java的switch语句工作的技术方式吗?
这个功能会被放到后面的Java版本中吗?
有人能解释一下为什么我不能这样做,比如,Java的switch语句工作的技术方式吗?
当前回答
JDK-13中的JEP 354: Switch Expressions(预览)和JDK-14中的JEP 361: Switch Expressions(标准)将扩展Switch语句,使其可以用作表达式。
现在你可以:
直接从开关表达式中分配变量, 使用新形式的开关标签(case L ->): “case L ->”开关标签右侧的代码被限制为表达式、块或(为方便起见)throw语句。 每个大小写使用多个常量,用逗号分隔, 而且也没有更多的价值突破: 为了从switch表达式中产生一个值,用yield语句代替break with value语句。
所以答案(1,2)的演示可能是这样的:
public static void main(String[] args) {
switch (args[0]) {
case "Monday", "Tuesday", "Wednesday" -> System.out.println("boring");
case "Thursday" -> System.out.println("getting better");
case "Friday", "Saturday", "Sunday" -> System.out.println("much better");
}
其他回答
如果代码中有一个地方可以打开String,那么最好将String重构为可能值的枚举,这样就可以打开String。当然,可以将string的潜在值限制为枚举中的值,这可能是需要的,也可能不是需要的。
当然,你的枚举可以有一个'other'条目,和一个fromString(String)方法,然后你可以有
ValueEnum enumval = ValueEnum.fromString(myString);
switch (enumval) {
case MILK: lap(); break;
case WATER: sip(); break;
case BEER: quaff(); break;
case OTHER:
default: dance(); break;
}
除了以上好的论点,我还要补充一点,今天很多人认为switch是Java过去过程化的过时残余(回到C时代)。
我不完全同意这个观点,我认为switch在某些情况下有它的用处,至少因为它的速度,无论如何,它比我在一些代码中看到的一系列级联数字要好…
但实际上,有必要考虑一下需要开关的情况,看看它是否不能被更面向对象的东西所取代。例如Java 1.5+中的枚举,也许是哈希表或其他集合(有时我后悔我们没有(匿名)函数作为第一类公民,就像Lua -没有开关-或JavaScript),甚至是多态性。
不是很漂亮,但这里是Java 6的另一种方式:
String runFct =
queryType.equals("eq") ? "method1":
queryType.equals("L_L")? "method2":
queryType.equals("L_R")? "method3":
queryType.equals("L_LR")? "method4":
"method5";
Method m = this.getClass().getMethod(runFct);
m.invoke(this);
从1.7开始直接使用String的例子如下:
public static void main(String[] args) {
switch (args[0]) {
case "Monday":
case "Tuesday":
case "Wednesday":
System.out.println("boring");
break;
case "Thursday":
System.out.println("getting better");
case "Friday":
case "Saturday":
case "Sunday":
System.out.println("much better");
break;
}
}
这个回答很好地解释了技术细节。我只是想添加Java 12开关表达式,你可以用下面的语法做到这一点:
String translation(String cat_language) {
return switch (cat_language) {
case "miau miau" -> "I am to run";
case "miauuuh" -> "I am to sleep";
case "mi...au?" -> "leave me alone";
default -> "eat";
};
}