openplanning

Hướng dẫn và ví dụ Java Iterator

  1. Iterator
  2. Examples
  3. remove()
  4. forEachRemaining(Consumer)
  5. ListIterator

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

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

Show More