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

时间:2014-07-17 18:45:43

标签: java for-loop foreach compiler-warnings

我的代码是:

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());
        }

我收到以下警告:

  

&#39;对于&#39;循环可以替换为&#39; foreach&#39;

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

感谢。

7 个答案:

答案 0 :(得分:12)

名为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内的计数器。

答案 1 :(得分:2)

for(People objPeople : people){
//Loop's code
}

官方文件here

答案 2 :(得分:2)

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}
}

答案 3 :(得分:1)

您可以使用以下内容替换该循环:

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

for(People people:peopleList)
{
Do something
}

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

当然它是可替换的,但我不明白Lint看到的“旧学校循环”有什么问题。它有两种作用。

似乎是宗教信仰:

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

答案 6 :(得分:0)

正如其他答案中所提到的,比较必须针对某个人的某些属性(年龄?)。

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

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