Java foreach пропустить первую итерацию

есть ли элегантный способ пропустить первую итерацию в цикле java5 foreach ?

пример псевдо-код:

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

10 ответов


Я бы не назвал это элегантным, но, возможно, лучше, чем использование" первого " булева:

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

кроме этого, вероятно, нет элегантного метода.  


С новой Java 8 API потока это на самом деле становится очень элегантной. Просто используйте skip() способ:

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

Используйте Guava Iterables.skip().

что-то типа:

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

(получил это с конца msandiford это!--4--> и хотел сделать его автономным ответа)


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

достаточно элегантный для меня.


код 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() ) из java.util via Заводной JDK


элегантное? Не реально. Вам нужно будет проверить / установить логическое значение.

цикл for-each является для всех практических целей причудливым синтаксисом для использования итератора. Вам лучше просто использовать итератор и продвигаться, прежде чем начинать цикл.


Не так элегантно, но работать с итераторами

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

это может быть не элегантно, но можно инициализировать целочисленную переменную вне цикла for и увеличивать ее с каждой итерацией внутри цикла. Ваша программа будет выполняться только если счетчик больше 0.

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