考虑:
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循环会是什么样子?
当前回答
public static Boolean Add_Tag(int totalsize)
{
List<String> fullst = new ArrayList<String>();
for(int k=0; k<totalsize; k++)
{
fullst.addAll();
}
}
其他回答
在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 each循环,它必须实现Iterable接口。
我将发布一个简单的示例,并尝试以不同的方式解释for each循环的工作原理。
对于每个循环示例:
public class ForEachTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("111");
list.add("222");
for (String str : list) {
System.out.println(str);
}
}
}
然后,如果我们使用javap来反编译这个类,我们将得到这个字节码示例:
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=4, args_size=1
0: new #16 // class java/util/ArrayList
3: dup
4: invokespecial #18 // Method java/util/ArrayList."<init>":()V
7: astore_1
8: aload_1
9: ldc #19 // String 111
11: invokeinterface #21, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
16: pop
17: aload_1
18: ldc #27 // String 222
20: invokeinterface #21, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
25: pop
26: aload_1
27: invokeinterface #29, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
从示例的最后一行可以看到,编译器将在编译时自动将for每个关键字的使用转换为Iterator的使用。这可以解释为什么对象(它没有实现Iterable接口)在尝试使用for each循环时会抛出异常。
使用较旧的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”。
在Java 8功能中,您可以使用以下功能:
List<String> messages = Arrays.asList("First", "Second", "Third");
void forTest(){
messages.forEach(System.out::println);
}
输出
First
Second
Third
还要注意,在原始问题中使用“foreach”方法确实有一些限制,例如在迭代过程中无法从列表中删除项目。
新的for循环更容易阅读,并且不需要单独的迭代器,但只有在只读迭代过程中才能真正使用。