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 extends Iterable

// Definition of the Iterable interface:
public interface Iterable {
    Iterator iterator();

    default void forEach(Consumer action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    default Spliterator spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

Iterator Methods


boolean hasNext()

E next();

// Optional operation.
default void remove()  

default void forEachRemaining(Consumer 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 flowers = new ArrayList();

        flowers.add("Tulip");
        flowers.add("Daffodil");
        flowers.add("Poppy");
        flowers.add("Sunflower");
        flowers.add("Bluebell");
        
        Iterator iterator = flowers.iterator();
        
        while(iterator.hasNext()) {
            String flower = iterator.next();
            System.out.println(flower);
        }
    }
}

Output :


Tulip
Daffodil
Poppy
Sunflower
Bluebell

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 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 years = new ArrayList();

        years.add(1998);
        years.add(1995);
        years.add(2000);
        years.add(2006);
        years.add(2021);
        
        Iterator 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 CollectionIterator 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 years = Arrays.asList(1998, 1995, 2000, 2006, 2021);
        
        Iterator 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)

Thực hiện hành động đã cho so với từng thành phần còn lại cho đến khi toàn bộ những thành phần đã được giải quyết và xử lý hoặc hành vi ném ra một ngoại lệ .


public default void forEachRemaining(Consumer 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 flowers = new HashSet();

        flowers.add("Tulip");
        flowers.add("Daffodil");
        flowers.add("Poppy");
        flowers.add("Sunflower");
        flowers.add("Bluebell");
        
        // Note: Iterator doesn't guarantee iteration order
        Iterator 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
  • TODO Link ?

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.