考虑:
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 = someList.iterator(); i.hasNext(); ) {
String x = i.next();
System.out.println(x);
}
其他回答
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);
});
正如许多其他答案正确指出的那样,for each循环只是同一个旧for循环的语法糖,编译器将其转换为同一个老for循环。
javac(OpenJDK)有一个开关-XD printflat,它生成一个Java文件,去掉了所有语法糖。完整的命令如下所示:
javac -XD-printflat -d src/ MyFile.java
//-d is used to specify the directory for output java file
所以让我们去掉语法糖
为了回答这个问题,我创建了一个文件,并为每个文件编写了两个版本,一个带有数组,另一个带有列表。我的Java文件如下所示:
import java.util.*;
public class Temp{
private static void forEachArray(){
int[] arr = new int[]{1,2,3,4,5};
for(int i: arr){
System.out.print(i);
}
}
private static void forEachList(){
List<Integer> list = Arrays.asList(1,2,3,4,5);
for(Integer i: list){
System.out.print(i);
}
}
}
当我用上面的开关编译这个文件时,我得到了以下输出。
import java.util.*;
public class Temp {
public Temp() {
super();
}
private static void forEachArray() {
int[] arr = new int[]{1, 2, 3, 4, 5};
for (/*synthetic*/ int[] arr$ = arr, len$ = arr$.length, i$ = 0; i$ < len$; ++i$) {
int i = arr$[i$];
{
System.out.print(i);
}
}
}
private static void forEachList() {
List list = Arrays.asList(new Integer[]{Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3), Integer.valueOf(4), Integer.valueOf(5)});
for (/*synthetic*/ Iterator i$ = list.iterator(); i$.hasNext(); ) {
Integer i = (Integer)i$.next();
{
System.out.print(i);
}
}
}
}
您可以看到,与其他语法糖(Autoboxing)一起,每个循环都被更改为简单循环。
它看起来像这样。非常粗糙。
for (Iterator<String> i = someList.iterator(); i.hasNext(); )
System.out.println(i.next());
Sun文档中对每一项都有很好的描述。
Java中的for each循环使用底层迭代器机制。因此,它与以下内容相同:
Iterator<String> iterator = someList.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
System.out.println(item);
}
这是一个等价的表达式。
for(Iterator<String> sit = someList.iterator(); sit.hasNext(); ) {
System.out.println(sit.next());
}