考虑:
List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList
for (String item : someList) {
System.out.println(item);
}
如果不使用for each语法,等价的for循环会是什么样子?
考虑:
List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList
for (String item : someList) {
System.out.println(item);
}
如果不使用for each语法,等价的for循环会是什么样子?
当前回答
for (Iterator<String> i = someIterable.iterator(); i.hasNext();) {
String item = i.next();
System.out.println(item);
}
注意,如果需要使用i.remove();在循环中,或者以某种方式访问实际的迭代器,不能使用for(:)习惯用法,因为实际的迭代器只是推断出来的。
正如Denis Bueno所指出的,这段代码适用于实现Iterable接口的任何对象。
此外,如果for(:)习惯用法的右侧是数组而不是Iterable对象,则内部代码使用int索引计数器并检查array.length。请参阅Java语言规范。
其他回答
Java“for each”循环构造将允许对两种类型的对象进行迭代:
T[](任何类型的数组)java.lang.Iterable<T>
Iterable<T>接口只有一个方法:Iterator<T>迭代器()。这对Collection<T>类型的对象有效,因为Collection<T<接口扩展了Iterable<T>。
每个习惯用法的Java只能应用于*Iterable类型的数组或对象。这个习惯用法是隐含的,因为它确实有迭代器支持。迭代器由程序员编程,通常使用整数索引或节点(取决于数据结构)来跟踪其位置。从理论上讲,它比常规的for循环慢,至少对于数组和列表等“线性”结构来说是这样,但它提供了更大的抽象性。
使用forEach:
int[] numbers = {1,2,3,4,5};
Arrays.stream(numbers).forEach(System.out::println);
答复:
1
2
3
4
5
The process finished with exit code 0
PS:您需要一个Array(int[]数字),然后导入java.util.Arrays;
Java中的for each循环使用底层迭代器机制。因此,它与以下内容相同:
Iterator<String> iterator = someList.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
System.out.println(item);
}
forEach的替代方案,以避免“for each”:
List<String> someList = new ArrayList<String>();
变体1(普通):
someList.stream().forEach(listItem -> {
System.out.println(listItem);
});
变体2(并行执行(更快)):
someList.parallelStream().forEach(listItem -> {
System.out.println(listItem);
});