openplanning

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

Xem thêm các chuyên mục:

Nhóm phát triển của chúng tôi vừa ra mắt website langlearning.net học tiếng Anh, Nga, Đức, Pháp, Việt, Trung, Hàn, Nhật, ... miễn phí cho tất cả mọi người.
Là một website được viết trên công nghệ web Flutter vì vậy hỗ trợ rất tốt cho người học, kể cả những người học khó tính nhất.
Hiện tại website đang tiếp tục được cập nhập nội dung cho phong phú và đầy đủ hơn. Mong các bạn nghé thăm và ủng hộ website mới của chúng tôi.
Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới. Facebook

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

Xem thêm các chuyên mục: