Руководство Java Iterator
1. Iterator
Iterator - это один из способов обхода (traverse) элементов Collection. Ниже приведены характеристики Iterator:
- Iterator не гарантирует порядок итераций элементов.
- Iterator может разрешить удаление элементов из Collection во время итерации, что зависит от типа Collection.
Иерархия подинтерфейсов of Iterator:
Причина, по которой вы можете перемещаться (traverse) по элементам of Collection с помощью Iterator, заключается в том, что Collection расширяется из интерфейса Iterable.
Collection Interface
// Definition of the Collection interface:
public interface Collection<E> extends Iterable<E>
// Definition of the Iterable interface:
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
Iterator Methods
boolean hasNext()
E next();
// Optional operation.
default void remove()
default void forEachRemaining(Consumer<? super E> action)
2. Examples
С помощью объекта Collection можно создать Iterator методом Collection.iterator(), а затем обходить элементы of Iterator с помощью метода next().
Например:
IteratorEx1.java
package org.o7planning.iterator.ex;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorEx1 {
public static void main(String[] args) {
// List is a subinterface of Collection.
List<String> flowers = new ArrayList<String>();
flowers.add("Tulip");
flowers.add("Daffodil");
flowers.add("Poppy");
flowers.add("Sunflower");
flowers.add("Bluebell");
Iterator<String> iterator = flowers.iterator();
while(iterator.hasNext()) {
String flower = iterator.next();
System.out.println(flower);
}
}
}
Output:
Tulip
Daffodil
Poppy
Sunflower
Bluebell
3. remove()
При обходе элементов of Collection с помощью Iterator, вы можете удалить текущий элемент из Collection. Метод Iterator.remove() позволяет это сделать. Однако не все Iterator поддерживают эту операцию, это зависит от типа Collection. Если он не поддерживается, будет выдано исключение UnsupportedOperationException.
// Optional Operation
public default void remove()
Например: ArrayList<Integer> содержит числа. Мы переберем его элементы и удалим текущий, если он четный.
Iterator_remove_ex1.java
package org.o7planning.iterator.ex;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Iterator_remove_ex1 {
public static void main(String[] args) {
// List is a subinterface of Collection.
List<Integer> years = new ArrayList<Integer>();
years.add(1998);
years.add(1995);
years.add(2000);
years.add(2006);
years.add(2021);
Iterator<Integer> iterator = years.iterator();
while(iterator.hasNext()) {
Integer current = iterator.next();
if(current % 2 ==0) {
iterator.remove(); // Remove current element.
}
}
// After remove all even numbers:
for(Integer year: years) {
System.out.println(year);
}
}
}
Output:
1995
2021
Пример о Collection, Iterator которой не поддерживает операцию Iterator.remove():
Iterator_remove_ex2.java
package org.o7planning.iterator.ex;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Iterator_remove_ex2 {
public static void main(String[] args) {
// Fixed-size List.
// Its Iterator does not support remove() operation.
List<Integer> years = Arrays.asList(1998, 1995, 2000, 2006, 2021);
Iterator<Integer> iterator = years.iterator();
while(iterator.hasNext()) {
Integer current = iterator.next();
if(current % 2 ==0) {
iterator.remove(); // UnsupportedOperationException!!
}
}
// After remove all even numbers:
for(Integer year: years) {
System.out.println(year);
}
}
}
Output:
Exception in thread "main" java.lang.UnsupportedOperationException: remove
at java.base/java.util.Iterator.remove(Iterator.java:102)
at org.o7planning.iterator.ex.Iterator_remove_ex2.main(Iterator_remove_ex2.java:20)
4. forEachRemaining(Consumer)
Выполняем данное действие для каждого оставшегося элемента до тех пор, пока все элементы не будут обработаны или действие не вызовет исключение.
public default void forEachRemaining(Consumer<? super E> action)
Например:
Iterator_forEachRemaining.java
package org.o7planning.iterator.ex;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Iterator_forEachRemaining {
public static void main(String[] args) {
// Set is a subinterface of Collection.
Set<String> flowers = new HashSet<String>();
flowers.add("Tulip");
flowers.add("Daffodil");
flowers.add("Poppy");
flowers.add("Sunflower");
flowers.add("Bluebell");
// Note: Iterator doesn't guarantee iteration order
Iterator<String> iterator = flowers.iterator();
String flower1 = iterator.next();
String flower2 = iterator.next();
System.out.println("Flower 1: " + flower1);
System.out.println("Flower 2: " + flower2);
System.out.println();
iterator.forEachRemaining(flower -> System.out.println(flower));
}
}
Output:
Flower 1: Poppy
Flower 2: Tulip
Daffodil
Sunflower
Bluebell
- Руководство Java Consumer
- Руководство Java HashSet
5. ListIterator
ListIterator - это подинтерфейс of Iterator. Это один из способов обхода элементов List. В отличие от Iterator, ListIterator поддерживает перемещение элементов как в прямом, так и в обратном направлениях. ListIterator также поддерживает удаление, обновление или вставку элемента во время итерации.
Руководства Java Collections Framework
- Руководство Java PriorityBlockingQueue
- Руководство Java Collections Framework
- Руководство Java SortedSet
- Руководство Java List
- Руководство Java Iterator
- Руководство Java NavigableSet
- Руководство Java ListIterator
- Руководство Java ArrayList
- Руководство Java CopyOnWriteArrayList
- Руководство Java LinkedList
- Руководство Java Set
- Руководство Java TreeSet
- Руководство Java CopyOnWriteArraySet
- Руководство Java Queue
- Руководство Java Deque
- Руководство Java IdentityHashMap
- Руководство Java WeakHashMap
- Руководство Java Map
- Руководство Java SortedMap
- Руководство Java NavigableMap
- Руководство Java HashMap
- Руководство Java TreeMap
- Руководство Java PriorityQueue
- Руководство Java BlockingQueue
- Руководство Java ArrayBlockingQueue
- Руководство Java TransferQueue
Show More