Java的foreach跳过第一次迭代

有没有一种优雅的方式来跳过Java5的foreach循环中的第一次迭代?

示例伪代码:

for ( Car car : cars ) { //skip if first, do work for rest . . } 

我不会称它为优雅的,但也许比使用“第一”布尔:

 for ( Car car : cars.subList( 1, cars.size() ) ) { . . } 

除此之外,可能没有优雅的方法。

新的Java 8 Stream API实际上变得非常优雅。 只需使用skip()方法:

 cars.stream().skip(1) // and then operations on remaining cars 
 for (Car car : cars) { if (car == cars[0]) continue; ... } 

对我来说足够优雅。

使用番石榴Iterables.skip()

就像是:

 for ( Car car : Iterables.skip(cars, 1) ) { // 1st element will be skipped } 

(从msandiford的答案的末尾得到这个,并且想把它作为一个独立的答案)

SeanA的代码有一个小错误:子列表的第二个参数被当作独占索引,所以我们可以写

 for (Car car : cars.subList(1, cars.size()) { ... } 

(我似乎无法对答案进行评论,因此提出了新的答案,我是否需要某种声望才能做到这一点?)

我迟到了一点,但是可以使用一个辅助方法,例如:

 public static <T> Iterable<T> skipFirst(final Iterable<T> c) { return new Iterable<T>() { @Override public Iterator<T> iterator() { Iterator<T> i = c.iterator(); i.next(); return i; } }; } 

并使用这样的东西:

 public static void main(String[] args) { Collection<Integer> c = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); for (Integer n : skipFirst(c)) { System.out.println(n); } } 

一般来说,跳过“n”是留给读者的一个练习:)


编辑 :仔细检查,我看到番石榴有一个Iterables.skip(...) 在这里 。

我不是一个Java人,但你可以使用:

for ( Car car : cars.tail() )通过Groovy JDK从java.util获得

优雅? 不是真的。 你需要检查/设置一个布尔值。

for-each循环适用于使用迭代器的所有实用目的。 在开始循环之前,最好使用迭代器并前进。

不太优雅,但与迭代器一起工作

 Iterator<XXXXX> rows = array.iterator(); if (rows.hasNext()){ rows.next(); } for (; rows.hasNext();) { XXXXX row = (XXXXX) rows.next(); } 

这可能不够高雅,但可以在for循环之外初始化一个整型variables,并在循环中每次迭代时增加它。 只有当计数器大于0时,程序才会执行。

 int counter = 0; for ( Car car : cars ) { //skip if first, do work for rest if(counter>0){ //do something } counter++; }