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--> и хотел сделать его автономным ответа)
код 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++;
}