当 return 语句出现在 lambda 表达式中时,它只是 导致 lambda 返回。 它不会导致封闭方法 返回。
那么,对于 switch 表达式,为什么引入了关键字
yield
而可以使用 return
关键字来代替呢?第一个 return 用于从方法返回,而内部一个则用于从 switch 语句返回。
class TestClass {
public int testMethod() {
// ...
int a = switch (allOptions) {
case "case1" -> {
System.out.println("case 1");
return 1;
}
default -> {
System.out.println("default");
return -1;
}
};
return a;
}
}
考虑 lambda 表达式的示例:
class TestClass {
interface FunctionalInterface {
int test(int n);
}
public int testMethod() {
FunctionalInterface f = (n) -> {
return n * 2;
};
return f.test(10);
}
}
为什么 return 关键字在第一个示例中令人困惑,而在第二个示例中却没有混淆?
最初,当JEP 325中引入switch表达式时,建议使用
break
来产生值。
int j = switch (day) { case MONDAY -> 0; case TUESDAY -> 1; default -> { int k = day.toString().length(); int result = f(k); break result; } };
在
JEP 354中更改为
yield
。有人提到:
两个语句,
(带或不带标签)和break
,有助于轻松消除 switch 语句和 switch 表达式之间的歧义:switch 语句而不是 switch 表达式可以是yield
语句的目标;并且 switch 表达式而不是 switch 语句可以作为break
语句的目标。yield
这可以被视为改变的一个原因。为此使用
return
当然不会“有助于轻松消除 switch 语句和 switch 表达式之间的歧义”,因为您也可以在 switch 语句中使用 return
。
然后,在JEP 361中,进一步解释了重载
break
是“令人困惑的”。
JEP 325 的一个方面是重载
语句以从 switch 表达式返回结果值。 JDK 12 的反馈表明break
的这种使用令人困惑。为了响应反馈,JEP 354 是作为 JEP 325 的演变而创建的。break
我想超载
return
也会“令人困惑”。
能够从 lambda 表达式返回并不完全是同样意义上的“重载”
return
。 lambda 表达式的主体代表函数主体。 return
从函数返回是有意义的。 switch 表达式的主体不是函数。
“当 return 语句出现在 lambda 表达式中时,它只会导致 lambda 返回。它不会导致封闭方法返回。 ...”
A lambda 表达式 是一个 闭包,因此它实际上是从该范围内的方法返回。
“...那么,对于switch 表达式,为什么引入了关键字
,而可以使用yield
关键字来代替?...”return
此处使用 return 关键字会重叠其含义。
当您想简单地从 switch 返回以及当您想从封闭方法返回时,传播很重要。
Java 中的很多东西都是故意写得超出逻辑要求。
Java 的一个基本品质是您可以像阅读句子一样阅读代码,类似于 Objective-C。
方法返回值和从开关表达式返回值。
所以,这似乎是可读性和架构师的选择问题,而不是任何功能差异。