考虑:
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循环会是什么样子?
当前回答
使用较旧的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> 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循环(也称为增强的for循环)是for循环的简化版本。优点是编写的代码更少,管理的变量更少。缺点是无法控制步长值,也无法访问循环体中的循环索引。
当阶跃值是简单的1增量,并且您只需要访问当前循环元素时,最好使用它们。例如,如果需要在数组或集合中的每个元素上循环,而不在当前元素的前面或后面偷看。
没有循环初始化,没有布尔条件,步长值是隐式的,是一个简单的增量。这就是为什么它们被认为比常规for循环简单得多。
增强的for循环遵循以下执行顺序:
1) 环形体
2) 从步骤1开始重复,直到遍历了整个数组或集合
示例–整数数组
int [] intArray = {1, 3, 5, 7, 9};
for(int currentValue : intArray) {
System.out.println(currentValue);
}
currentValue变量保存在intArray数组中循环的当前值。请注意,没有显式的步长值——它总是以1为增量。
冒号可以被认为是“in”的意思。因此,增强的for循环声明声明:循环intArray并将当前数组int值存储在currentValue变量中。
输出:
1
3
5
7
9
示例–字符串数组
我们可以使用for each循环遍历字符串数组。循环声明声明:循环myStringsString数组并将当前String值存储在currentString变量中。
String [] myStrings = {
"alpha",
"beta",
"gamma",
"delta"
};
for(String currentString : myStrings) {
System.out.println(currentString);
}
输出:
alpha
beta
gamma
delta
示例–列表
增强的for循环还可以用于迭代java.util.List,如下所示:
List<String> myList = new ArrayList<String>();
myList.add("alpha");
myList.add("beta");
myList.add("gamma");
myList.add("delta");
for(String currentItem : myList) {
System.out.println(currentItem);
}
循环声明声明:循环myList List of Strings并将当前List值存储在currentItem变量中。
输出:
alpha
beta
gamma
delta
示例–集合
增强的for循环还可以用于迭代java.util.Set,如下所示:
Set<String> mySet = new HashSet<String>();
mySet.add("alpha");
mySet.add("alpha");
mySet.add("beta");
mySet.add("gamma");
mySet.add("gamma");
mySet.add("delta");
for(String currentItem : mySet) {
System.out.println(currentItem);
}
循环声明声明:循环mySet字符串集,并将当前Set值存储在currentItem变量中。注意,因为这是一个Set,所以不会存储重复的String值。
输出:
alpha
delta
beta
gamma
来源:Java中的循环–终极指南
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());
}
nsayer的答案暗示了这一点,但值得注意的是,当“someList”是实现java.lang.Iterable的任何东西时,OP的for(..)语法都会起作用——它不必是列表,也不必是java.util的集合。因此,甚至您自己的类型也可以与此语法一起使用。