Способы итерации по списку на JavaJAVA

Программисты JAVA общаются здесь
Anonymous
Способы итерации по списку на Java

Сообщение Anonymous »

Будучи несколько новым для языка Java, я пытаюсь ознакомиться со всеми способами (или, по крайней мере, непатологическими), которые можно было бы перевести через список (или, возможно, другие коллекции) и преимущества или недостатки каждого. < /p>

Учитывается список list < /code> объект, я знаю о следующих способах зацикливания по всем элементам: < /p>

базовый для цикла (конечно, там эквивалент < /code> /do, пока < /code>) < /h3>

< /code> /do

Код: Выделить всё

// Not recommended (see below)!
for (int i = 0; i < list.size(); i++) {
E element = list.get(i);
// 1 - can call methods of element
// 2 - can use 'i' to make index-based calls to methods of list

// ...
}
< /code>

Примечание. Как указал @amarseillan, эта форма является плохим выбором
для итерации над списком < /code> s, поскольку фактическая реализация
метод Get < /code> может быть не так эффективно, как при использовании итератора < /code>. Получите элемент i-th. < /p>

В приведенном выше примере нет никакого способа для реализации < /code> к
«Сохранить свое место», чтобы сделать будущие итерации более эффективными.
для ArrayList 
это не имеет значения, потому что сложность/стоимость GET - постоянное время (O (1)), тогда как для LinkedList является пропорциональным размеру списка (O (n)). < /p>

Для получения дополнительной информации о вычислительной сложности реализаций встроенных коллекций < /code> ознакомьтесь с этим вопросом.

Код: Выделить всё

for (E element : list) {
// 1 - can call methods of element

// ...
}
< /code>

 итератор < /h3>

for (Iterator iter = list.iterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list

// ...
}
< /code>

 listicerator < /h3>

for (ListIterator iter = list.listIterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list
// 3 - can use iter.add(...) to insert a new element into the list
//     between element and iter->next()
// 4 - can use iter.set(...) to replace the current element

// ...
}
< /code>

 функциональная java < /h3>

list.stream().map(e -> e + 1); // Can apply a transformation function for e
< /code>

 iterable.foreach, stream.foreach, ... < /h3>

(метод карты от Java 8 Stream API (см. @i_am_zero ответ). Фореш 
Метод, который можно использовать вместо оператора для цикла, показанного выше. (Вот еще один вопрос, который обеспечивает хорошее сравнение.) < /P>

Arrays.asList(1,2,3,4).forEach(System.out::println);
// 1 - can call methods of an element
// 2 - would need reference to containing object to remove an item
// (TODO: someone please confirm / deny this)
// 3 - functionally separates iteration from the action
// being performed with each item.

Arrays.asList(1,2,3,4).stream().forEach(System.out::println);
// Same capabilities as above plus potentially greater
// utilization of parallelism
// (caution: consequently, order of execution is not guaranteed,
// see [Stream.forEachOrdered][stream-foreach-ordered] for more
// information about this).
< /code>

Какие еще есть способы, если таковые имеются?>

Подробнее здесь: https://stackoverflow.com/questions/184 ... st-in-java

Вернуться в «JAVA»