Hướng dẫn sử dụng Iterator trong Java

Iterator là một trong những cách được sử dụng để duyệt qua các phần tử của một collection. 

Lần đầu tiên được giới thiệu ở phiên bản Java 1.2 thay thế cho Enumeration bao gồm nhiều phương pháp cải tiến hiệu suất và cho phép xoá các phần tử khi đang duyệt một collection. Ngoài ra, Iterator không đảm bảo thứ tự các phần tử.

Iterator Interface

Để bắt đầu, chúng ta cần lấy một Iterator từ một collection; điều này được thực hiện bằng cách gọi phương thức iterator(). 

List<String> items = ...
Iterator<String> iter = items.iterator();

Iterator interface có ba phương thức chính

hashNext()

Hàm hasNext() có thể sử dụng để kiểm tra liệu trong Iterator còn lại phần tử nào hay không? Method này được thiết kế để sử dụng trong vòng lặp while.

 

while (iter.hasNext()) {
    // ...
}

next()

Hàm next() cho phép chúng ta di chuyển con trỏ qua phần tử tiếp theo và trả về phần tử hiện tại mà con trỏ đang trỏ đến.

String next = iter.next();

Note: Bạn nên sử dụng hasNext() trước khi thử gọi next ().

remove()

Cuối cùng, hàm remove() được dùng để xoá phần tử hiện tại khỏi collection.

iter.remove();

Đây là một cách an toàn để loại bỏ các phần tử trong khi lặp qua một collection mà không có rủi ro xảy ra ConcurrentModificationException.

Ví dụ

Bây giờ, chúng ta sẽ thử kết hợp các method trên để triển khai một ví dụ cụ thể.

while (iter.hasNext()) {
    String next = iter.next();
    System.out.println(next);
 
    if( "TWO".equals(next)) {
        iter.remove();				
    }
}

Đây là cách mà chúng ta thường sử dụng một Iterator. Trước tiên cần kiểm tra xem sự tồn tại của các phần tử, sau đó truy vấn và thao tác trên các phần tử này.

Duyệt với Lamdba expression

Ở các ví dụ trước chúng ta đã sử dụng Iterator để duyệt các phần tử sử dụng mã code thông thường. Ngoài ra chúng ta có thể triển khai lambda expression để duyệt các phần tử cách nhanh chóng và ngắn gọn hơn.

iter.forEachRemaining(System.out::println);

ListIterator interface

ListIterator là một phần mở rộng cho Iterator cung cấp nhiều chức năng hơn. Chúng ta có thể khởi tạo ListIterator thông qua

ListIterator<String> listIterator = items.listIterator(items.size());

hasPrevious() and previous()

ListIterator có thể được sử dụng để duyệt ngược trở lại các phần tử đã duyệt qua trước đó thông qua hasNext() và next()

while(listIterator.hasPrevious()) {
    String previous = listIterator.previous();
}

nextIndex() and previousIndex()

Ngoài ra, 2 method này có thể dùng để truy vấn vị trí phần tử trước và sau của phần tử hiện tại.

String nextWithIndex = items.get(listIterator.nextIndex());
String previousWithIndex = items.get(listIterator.previousIndex());

add()

Phương thức add, như tên gợi ý, cho phép chúng ta thêm một phần tử vào trước phần tử sẽ được trả về bởi next() và sau phần tử  được trả về bởi previous():

listIterator.add("FOUR");

Set()

Hàm cuối cùng cho phép chúng ta thay thế phần tử đang được trỏ đến hiện tại.

String next = listIterator.next();
if( "ONE".equals(next)) {
    listIterator.set("SWAPPED");
}

Ví dụ

Giờ đây, chúng ta có thể triển khai một ví dụ sử dụng các method trên để có thể hiểu rõ hơn về cách sử dụng chúng.

ListIterator<String> listIterator = items.listIterator();
while(listIterator.hasNext()) {
    String nextWithIndex = items.get(listIterator.nextIndex());		
    String next = listIterator.next();
    if("REPLACE ME".equals(next)) {
        listIterator.set("REPLACED");
    }
}
listIterator.add("NEW");
while(listIterator.hasPrevious()) {
    String previousWithIndex
     = items.get(listIterator.previousIndex());
    String previous = listIterator.previous();
    System.out.println(previous);
}

Kết bài

Interface Iterator cho phép chúng ta sửa đổi một collection khi duyệt qua các phần tử của nó, nếu sử dụng vòng lặp for, while thông thường thì sẽ khó sử lý hơn nhiều so với Iterator.

Nguồn

https://www.baeldung.com/java-iterator

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x