【问题标题】:How does a for each loop guard against an empty list?for each 循环如何防止空列表?
【发布时间】:2014-09-10 18:55:41
【问题描述】:

我在http://www.leepoint.net/notes-java/flow/loops/foreach.html 上阅读。 for each 等价于

for (int i = 0; i < arr.length; i++) { 
     type var = arr[i];
      body-of-loop
}

for (type var : arr) {
      body-of-loop
}

我的问题是 for each 循环如何为空列表工作。我知道对于常规的 for 循环, arr.length 只会计算为 0 并且循环不会执行。 for each 循环呢?

【问题讨论】:

    标签: java for-loop foreach


    【解决方案1】:

    我的问题是 for each 循环如何为空列表工作

    ForEach 也以同样的方式工作。如果长度为零,则永远不会执行循环。

    它们之间的唯一区别是当您想要迭代列表或数组的所有项目时使用ForEach 循环,而在普通for 循环的情况下您可以控制开始和结束索引。

    【讨论】:

    • 您始终可以使用if(something) break; IOW 控制for-each 循环的结束,您没有 迭代整个内容。
    【解决方案2】:

    它使用 Iterable 集合的迭代器,例如列表。 Iterator 的实现者有责任编写 hasext() 方法以在没有下一项的情况下返回 false,如果集合为空,则会出现这种情况

    【讨论】:

    • 但问题是关于数组,而不是集合。
    • 我喜欢这个,但你能澄清一下 java 文档,它说一个迭代器迭代一个集合吗?
    • 它在语言规范部分 14.14.2 简而言之,如果集合(小 c)是一个数组,那么编译器会将代码转换为带有 int 计数器的标准 for 循环,如果集合(small c) 是一个 Iterable(包括 Collection 类)然后它调用迭代器。
    【解决方案3】:

    是的,它是等价的。

    如果列表为空,则for-each循环甚至不会执行一次。

    【讨论】:

    • 它是如何回答这个问题的? OP 知道问题中的两个代码示例是等效的,并询问 foreach 循环如何处理空数组,而不是它是否有效。
    • @Eran - 第二句回答了这个问题,对于空列表它没有被执行(这意味着,它有效并且它没有被执行,你不能说更多)。
    【解决方案4】:

    正如@user3810043 在他们的回答 cmets 中所暗示的那样,增强的for 语句在字面上与等效的基本for 语句的评估相同:

    14.14.2。增强的 for 语句

    ...

    Expression 的类型必须是原始类型 Iterable 的子类型或数组类型(第 10.1 节),否则会发生编译时错误。

    ...

    否则,表达式必须具有数组类型 T[]。

    令 L1 ... Lm 立即成为(可能为空的)标签序列 在增强的 for 语句之前。

    增强的 for 语句等价于基本的 for 语句 形式:

    T[] #a = Expression;
    L1: L2: ... Lm:
    for (int #i = 0; #i < #a.length; #i++) {
        {VariableModifier} TargetType Identifier = #a[#i];
        Statement
    }
    

    #a 和 #i 是自动生成的标识符,与增强 for 语句发生时范围内的任何其他标识符(自动生成或其他方式)不同。

    ^ 引用The Java® Language Specification

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多