跳过第一次迭代

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

示例伪代码:

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

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

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

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

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

For-each 循环实际上是使用迭代器的花哨语法。最好在开始循环之前使用迭代器并进行升级。

我不喜欢爪哇语,但你可以用:

从 java.util 通过 Groovy JDK

for (Car car : cars)
{
if (car == cars[0]) continue;
...
}

对我来说够优雅了。

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

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

(我似乎不能评论答案,因此才有了新的答案。我是否需要一定的名声才能做到这一点?)

我来得有点晚,但是你可以使用一个 helper 方法,比如:

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(...) 给你

使用番石榴 Iterables.skip()

比如:

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

(从 Msandiford 的回答的结尾得到了这个,并希望使它成为一个独立的答案)

没有那么优雅,但是使用迭代器

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

新的 Java8数据流 API实际上变得非常优雅,只需使用 skip()方法:

cars.stream().skip(1) // and then operations on remaining cars

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

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

你可以用计数器。虽然不是很成熟的编码,但是我发现跳过列表中的第一个元素是最简单的方法。

    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++;
}