Hướng dẫn và ví dụ Java Iterator
1. Iterator
Iterator là một trong các cách giúp bạn duyệt qua (traverse) các phần tử của một Collection. Sau đây là các đặc điểm của Iterator:
- Iterator không đảm bảo thứ tự lặp các phần tử.
- Iterator có thể cho phép loại bỏ phần tử ra khỏi Collection trong quá trình lặp, điều này phụ thuộc vào kiểu Collection.
Hệ thống phân cấp các interface con của Iterator:
Sở dĩ một bạn có thể duyệt qua (traverse) các phần tử của một Collection bằng Iterator là vì Collection mở rộng từ interface 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
Từ một đối tượng Collection bạn có thể tạo ra đối tượng Iterator thông qua phương thức Collection.iterator(). Sau đó duyệt qua các phần tử của Iterator bằng phương thức next().
Ví dụ:
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()
Trong quá trình đi qua (traverse) các phần tử của một Collection sử dụng Iterator, bạn có thể loại bỏ phần tử hiện tại ra khỏi Collection. Phương thức Iterator.remove() cho phép bạn làm điều đó. Tuy nhiên không phải tất cả các Iterator đều hỗ trợ hoạt động này, nó phụ thuộc vào kiểu Collection. Nếu không được hỗ trợ UnsupportedOperationException sẽ được ném ra.
// Optional Operation
public default void remove()
Ví dụ: Một ArrayList<Integer> chứa các số. Chúng ta sẽ duyệt qua các phần tử của nó và loại bỏ phần tử hiện tại nếu nó là số chẵn.
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
Ví dụ về một Collection mà Iterator của nó không hỗ trợ hoạt động 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)
Thực hiện hành động đã cho đối với từng phần tử còn lại cho đến khi tất cả các phần tử đã được xử lý hoặc hành động ném ra một ngoại lệ.
public default void forEachRemaining(Consumer<? super E> action)
Ví dụ:
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
- Hướng dẫn và ví dụ Java Consumer
- Hướng dẫn và ví dụ Java HashSet
5. ListIterator
ListIterator là một interface con của Iterator. Nó là một trong các cách giúp bạn duyệt qua (traverse) các phần tử của một List. Khác với Iterator, ListIterator hỗ trợ duyệt qua các phần tử theo cả 2 hướng tiến và lùi. ListIterator cũng hỗ trợ loại bỏ, cập nhập hoặc chèn một phần tử trong quá trình lặp.
Các hướng dẫn Java Collections Framework
- Hướng dẫn và ví dụ Java PriorityBlockingQueue
- Hướng dẫn sử dụng nền tảng tập hợp trong Java (Java Collection Framework)
- Hướng dẫn và ví dụ Java SortedSet
- Hướng dẫn và ví dụ Java List
- Hướng dẫn và ví dụ Java Iterator
- Hướng dẫn và ví dụ Java NavigableSet
- Hướng dẫn và ví dụ Java ListIterator
- Hướng dẫn và ví dụ Java ArrayList
- Hướng dẫn và ví dụ Java CopyOnWriteArrayList
- Hướng dẫn và ví dụ Java LinkedList
- Hướng dẫn và ví dụ Java Set
- Hướng dẫn và ví dụ Java TreeSet
- Hướng dẫn và ví dụ Java CopyOnWriteArraySet
- Hướng dẫn và ví dụ Java Queue
- Hướng dẫn và ví dụ Java Deque
- Hướng dẫn và ví dụ Java IdentityHashMap
- Hướng dẫn và ví dụ Java WeakHashMap
- Hướng dẫn và ví dụ Java Map
- Hướng dẫn và ví dụ Java SortedMap
- Hướng dẫn và ví dụ Java NavigableMap
- Hướng dẫn và ví dụ Java HashMap
- Hướng dẫn và ví dụ Java TreeMap
- Hướng dẫn và ví dụ Java PriorityQueue
- Hướng dẫn và ví dụ Java BlockingQueue
- Hướng dẫn và ví dụ Java ArrayBlockingQueue
- Hướng dẫn và ví dụ Java TransferQueue
Show More