java foreach跳过第一次迭代

Ami*_*ani 52 java iteration foreach skip

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

示例伪代码:

for ( Car car : cars ) {     
   //skip if first, do work for rest
   .
   .
}
Run Code Online (Sandbox Code Playgroud)

Sea*_*son 63

我不会称之为优雅,但可能比使用"第一个"布尔值更好:

for ( Car car : cars.subList( 1, cars.size() ) )
{
   .
   .
}
Run Code Online (Sandbox Code Playgroud)

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


Kao*_*Kao 54

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

cars.stream().skip(1) // and then operations on remaining cars
Run Code Online (Sandbox Code Playgroud)


yop*_*p83 28

使用番石榴Iterables.skip().

就像是:

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

(从msandiford的回答结束后得到这个,并想让它成为一个独立的答案)


ele*_*ent 26

for (Car car : cars)
{
   if (car == cars[0]) continue;
   ...
}
Run Code Online (Sandbox Code Playgroud)

对我来说足够优雅.

  • EW.为循环的每次迭代添加不必要的条件?不用了,谢谢. (7认同)
  • 除非重复一个元素,否则优雅+1. (2认同)

Dan*_*rov 18

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

for (Car car : cars.subList(1, cars.size()) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

(我似乎无法评论答案,因此得到了新答案.我需要一定的声誉吗?)  

  • 你现在应该可以[评论](http://stackoverflow.com/privileges/comment). (2认同)

msa*_*ord 6

我来晚了一点,但你可以使用辅助方法,例如:

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;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

并使用这样的东西:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

推广跳过"n"留给读者练习:)


编辑:仔细观察,我看到番石榴在Iterables.skip(...) 这里.