考虑:

List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList
for (String item : someList) {
    System.out.println(item);
}

如果不使用for each语法,等价的for循环会是什么样子?


当前回答

在Java 8功能中,您可以使用以下功能:

List<String> messages = Arrays.asList("First", "Second", "Third");

void forTest(){
    messages.forEach(System.out::println);
}

输出

First
Second
Third

其他回答

它消除了所有基本的循环混乱,为代码增添了美感。它为您的代码提供了一个干净的外观,如下所示。

循环正常:

void cancelAll(Collection<TimerTask> list) {
    for (Iterator<TimerTask> i = list.iterator(); i.hasNext();)
         i.next().cancel();
}

用于每个:

void cancelAll(Collection<TimerTask> list) {
    for (TimerTask t : list)
        t.cancel();
}

for each是实现Iterator的集合上的构造。记住,您的集合应该实现Iterator;否则,不能将其用于每个。

以下行读作“for each TimerTask t in list”

for (TimerTask t : list)

每种情况下出现错误的可能性较小。您不必担心初始化迭代器或初始化循环计数器并终止它(在存在错误的地方)。

使用较旧的Java版本(包括Java7),可以使用foreach循环,如下所示。

List<String> items = new ArrayList<>();
items.add("A");
items.add("B");
items.add("C");
items.add("D");
items.add("E");

for(String item : items) {
    System.out.println(item);
}

以下是Java8中使用for-each循环的最新方法(使用forEach+lambda表达式或方法引用循环List)。

Lambda公司

// Output: A,B,C,D,E
items.forEach(item->System.out.println(item));

方法参考

// Output: A,B,C,D,E
items.forEach(System.out::println);

有关详细信息,请参阅“Java 8 For Each examples”。

for (Iterator<String> itr = someList.iterator(); itr.hasNext(); ) {
   String item = itr.next();
   System.out.println(item);
}

在Java 8之前,您需要使用以下功能:

Iterator<String> iterator = someList.iterator();

while (iterator.hasNext()) {
    String item = iterator.next();
    System.out.println(item);
}

然而,通过在Java8中引入Streams,您可以用更少的语法完成同样的任务。例如,对于someList,您可以执行以下操作:

someList.stream().forEach(System.out::println);

你可以在这里找到更多关于溪流的信息。

它看起来像这样。非常粗糙。

for (Iterator<String> i = someList.iterator(); i.hasNext(); )
        System.out.println(i.next());

Sun文档中对每一项都有很好的描述。