71

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

示例伪代码:

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

11 回答 11

75

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

cars.stream().skip(1) // and then operations on remaining cars
于 2014-08-02T11:01:10.343 回答
74

我不会称之为优雅,但也许比使用“第一个”布尔值更好:

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

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

于 2011-04-18T23:46:54.773 回答
29
for (Car car : cars)
{
   if (car == cars[0]) continue;
   ...
}

对我来说足够优雅。

于 2011-04-19T00:14:17.603 回答
28

使用番石榴Iterables.skip()

就像是:

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

(从msandiford 的答案末尾得到这个,并希望使它成为一个独立的答案)

于 2013-08-21T18:44:54.890 回答
19

SeanA 的代码有一个小错误:sublist 的第二个参数被视为排他索引,所以我们可以写

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

(我似乎无法评论答案,因此是新答案。我需要一定的声誉才能做到这一点吗?)  

于 2011-04-19T03:04:13.553 回答
7

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

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”作为练习留给读者:)


编辑:仔细检查后,我发现 Guava 有一个Iterables.skip(...) here

于 2011-04-19T03:36:53.197 回答
3

我不是 java 人,但你可以使用:

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

于 2011-04-18T23:52:07.037 回答
3

不是那么优雅,但可以使用迭代器

Iterator<XXXXX> rows = array.iterator();
if (rows.hasNext()){
    rows.next();
}
for (; rows.hasNext();) {
    XXXXX row = (XXXXX) rows.next();
}
于 2014-06-03T18:27:14.313 回答
1

优雅的?并不真地。您需要检查/设置一个布尔值。

出于所有实际目的,for-each 循环是使用迭代器的花哨语法。最好在开始循环之前使用迭代器并推进。

于 2011-04-18T23:47:39.173 回答
1

这可能并不优雅,但可以在 for 循环外初始化一个整数变量,并在循环内的每次迭代中递增它。只有当计数器大于 0 时,您的程序才会执行。

int counter = 0;
for ( Car car : cars ) {
    //skip if first, do work for rest
    if(counter>0){
        //do something
    }
    counter++;
}
于 2016-08-17T09:34:57.533 回答
0

您可以使用计数器。虽然没有那么成熟的编码,但我仍然发现它是从列表中跳过第一个元素的最简单方法。

    int ctr=0;
    for(Resource child:children) {
    if(ctr>0) { //this will skip the first element, i.e. when ctr=0
    //do your thing from the 2nd element onwards
    }
    ctr++;
    }
于 2019-01-16T05:20:16.037 回答