为什么要为 switch 表达式引入yield关键字? (不仅仅是使用 return 关键字)

问题描述 投票:0回答:3

当 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 关键字在第一个示例中令人困惑,而在第二个示例中却没有混淆?

java lambda switch-expression
3个回答
3
投票

最初,当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
(带或不带标签)和
yield
,有助于轻松消除 switch 语句和 switch 表达式之间的歧义:switch 语句而不是 switch 表达式可以是
break
语句的目标;并且 switch 表达式而不是 switch 语句可以作为
yield
语句的目标。

这可以被视为改变的一个原因。为此使用

return
当然不会“有助于轻松消除 switch 语句和 switch 表达式之间的歧义”,因为您也可以在 switch 语句中使用
return

然后,在JEP 361中,进一步解释了重载

break
是“令人困惑的”。

JEP 325 的一个方面是重载

break
语句以从 switch 表达式返回结果值。 JDK 12 的反馈表明
break
的这种使用令人困惑。为了响应反馈,JEP 354 是作为 JEP 325 的演变而创建的。

我想超载

return
也会“令人困惑”。

能够从 lambda 表达式返回并不完全是同样意义上的“重载”

return
。 lambda 表达式的主体代表函数主体。
return
从函数返回是有意义的。 switch 表达式的主体不是函数。


3
投票

“当 return 语句出现在 lambda 表达式中时,它只会导致 lambda 返回。它不会导致封闭方法返回。 ...”

A lambda 表达式 是一个 闭包,因此它实际上是从该范围内的方法返回。

“...那么,对于switch 表达式,为什么引入了关键字

yield
,而可以使用
return
关键字来代替?...”

此处使用 return 关键字会重叠其含义。

当您想简单地从 switch 返回以及当您想从封闭方法返回时,传播很重要。

Java 中的很多东西都是故意写得超出逻辑要求。
Java 的一个基本品质是您可以像阅读句子一样阅读代码,类似于 Objective-C


2
投票
就我个人而言,我发现在 switch 表达式中使用 Yield 关键字很直观。它有助于区分从

方法返回值和从开关表达式返回值。

所以,这似乎是可读性和架构师的选择问题,而不是任何功能差异。

© www.soinside.com 2019 - 2024. All rights reserved.