【问题标题】:'for' loop replaceable with 'foreach''for' 循环可替换为 'foreach'
【发布时间】:2014-07-17 18:45:42
【问题描述】:

我的代码是:

ArrayList<People> people = new ArrayList<>();

// people.add(...);
// people.add(...);

        for (int i = 0; i < people.size(); i++) {
            if (people.get(i) > 60.0)
                System.out.println(people.get(i).toString());
        }

我收到以下警告:

'for'循环可替换为'foreach'

我应该如何使用 foreach 修改循环?

谢谢。

【问题讨论】:

  • for (People person : people) { ....},但你肯定已经查过了,不是吗?
  • (people.get(i) &gt; 60.0) - 这段代码能编译吗?如何将 People 实例与双常量进行比较?
  • 这真的是编译器警告吗?我认为编译器不在乎。我的 IDE 给了我这个警告。
  • @Eran,List-people 的每个元素都包含一个 double 值。

标签: java for-loop foreach compiler-warnings


【解决方案1】:

名为people 的列表通常包含Person 对象。

下面是一些示例代码,展示了如何使用 for-each 循环:

public class Demo {

    private static class Person {
       public int age;
       public String name;

       public Person(int age, String name) {
           this.age = age;
           this.name = name;
       }
    }

    public static void main(String... args) {

        // Create and populate a list of people with individuals
        List<Person> people = new ArrayList<>();
        people.add(new Person(32, "Fred"));
        people.add(new Person(45, "Ginger"));
        people.add(new Person(66, "Elsa"));

        // Iterate over the list (one person at a time)
        for (Person person : people) {
            if (person.age > 60) {
                System.out.println("Old person: " + person.name);
            }
        }
    }
}

您也可以阅读Oracle Java documentation about for-each loops

一般形式为:

for (Person person : people) {
    ...
}

代替:

for (int i = 0; i < people.size(); i++) { 
    Person person = people.get(i);
    ...
}

通常推荐使用 for-each,因为它更简洁。 但是,如果您需要知道您将不得不使用的项目的索引号 原始 for 循环或在 for-each 中增加一个计数器。

【讨论】:

    【解决方案2】:
    for(People objPeople : people){
    //Loop's code
    }
    

    官方文档here

    【讨论】:

      【解决方案3】:
      people.get(i) retrun an object of class People. 
      

      不能在 if 语句中将对象与数字进行比较。

      编辑

      如何迭代Arraylist

      1)
      
      for (int i = 0; i < people.size(); i++) {
         if(people.get(i).getAvalue() > 60.0 ){//your code}
      }
      

      2)

      for(People p: people){
        if(p.getAvalue()>60.0){//you code}
      }
      

      【讨论】:

      • 这应该是一条评论。
      • 这是代码中的错误。所有其他答案都是关于解析数组列表。
      • 这与问题无关。
      • 如果我犯了这么严重的错误,我可以删除我的答案,结束误解
      【解决方案4】:

      您可以使用 for each 替换该循环,如下所示:

      ArrayList<People> peopleList = new ArrayList<>();
      
      for(People people:peopleList)
      {
      Do something
      }
      

      【讨论】:

        【解决方案5】:

        我发现 for 循环以后更容易理解。在代码之前添加此注释以仅禁用对这种情况的检查。

        //noinspection ForLoopReplaceableByForEach
        for (int i = 0; i < people.size(); i++) { 
            Person person = people.get(i);
            ...
        }
        

        【讨论】:

          【解决方案6】:

          当然它是可替换的,但我不明白 Lint 看到的“老派 for 循环”有什么问题。它适用于两种方式。

          似乎是宗教的东西:

          “那么什么时候应该使用 for-each 循环?任何时候都可以。它确实美化了你的代码。” (https://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html)

          【讨论】:

            【解决方案7】:

            正如其他答案中提到的,比较需要针对 Person 的某些属性(年龄?)。

            假设您进行了比较修复,for 循环的流版本可能如下所示:

            people.stream()
                .filter(p -> p.getAge() > 60.0)
                .forEach(p -> System.out.println(p.toString());
            

            【讨论】: