当前位置: 代码迷 >> java >> 为什么我无法在Java 8中继续使用带有Collections#forEach的标签?
  详细解决方案

为什么我无法在Java 8中继续使用带有Collections#forEach的标签?

热度:58   发布时间:2023-07-27 09:34:27.0

编译后没有任何错误:

class App {
    boolean b;
    boolean c;

    void foo(List<Integer> ints) {
        myLabel:
        for (Integer i : ints) {
            while (!b) {
                if (c) {
                    continue myLabel;
                }
            }
        };
    }
}

但如果我按如下方式修改foo

void foo(List<Integer> ints) {
    myLabel:
    ints.forEach(integer -> {
        while (!b) {
            if (c) {
                continue myLabel;
            }
        }
    });
}

我得到Error:(17, 21) undefined label: myLabel

有什么不同? 据我所知,新的forEach只是增强for循环的捷径?

正如评论中所述, forEach只是一个方法调用。 片段

myLabel: ints.forEach(integer -> ...);

是一个带 :

标识符语句标签与出现在标记语句中任何位置的breakcontinue语句(第14.15节,第14.16节)一起使用。

重复一下,带标签的语句是方法调用表达式。 您的continue声明不在标签声明范围内。

您的位于lambda表达式正文中的while语句中。

带有标签Identifier continue语句尝试将控制转移到与其标签具有相同Identifier的封闭标签语句(第14.7节); 该语句称为继续目标,然后立即结束当前迭代并开始新的迭代。

[...]

continue目标必须是whiledofor语句,否则会发生编译时错误。

continue语句必须引用直接封闭的方法,构造函数,初始值设定项或lambda体内的标签。 没有非本地跳跃。 如果在立即封闭的方法,构造函数,初始化程序或lambda主体中没有带Identifier标签语句作为其标签,则包含continue语句,则会发生编译时错误

由于在紧邻的lambda体中没有名为myLabel标记( whiledofor )语句,因此会出现编译时错误。

  相关解决方案