使用迭代器
使用for-each循環(huán)
使用forEach()方法
使用迭代器
集合提供了一個迭代器來遍歷其所有元素。
迭代器可以對集合執(zhí)行以下三個操作:
檢查是否有尚未訪問的元素。
訪問集合中的下一個元素。
刪除集合的最后訪問元素。
Java中的迭代器是?Iterator< E>?接口的一個實例。
我們可以使用Collection接口中的iterator()方法獲取集合的迭代器。
以下代碼創(chuàng)建一個字符串列表,并獲取列表的迭代器:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
? public static void main(String[] args) {
? ? // Create a list of strings
? ? List<String> names = new ArrayList<>();
? ? // Get an iterator for the list
? ? Iterator<String> nameIterator = names.iterator();
? }
}
迭代器< E> 接口包含以下方法:
boolean hasNext()
E next()
default void? remove()
default void? forEachRemaining(Consumer<? super? E> action)
如果集合中有更多元素要迭代,?hasNext()方法將返回true。否則,它返回false。
next()方法返回集合中的下一個元素。我們應(yīng)該在調(diào)用?next()方法之前調(diào)用?hasNext()方法。如果沒有,?next()方法會拋出NoSuchElementException異常。
例子
通常,?hasNext()和?next()方法在循環(huán)中一起使用。以下代碼使用迭代器打印列表的所有元素:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
? public static void main(String[] args) {
? ? // Create a list of strings
? ? List<String> names = new ArrayList<>();
? ? names.add("A");
? ? names.add("B");
? ? names.add("C");
? ? // Get an iterator for the list
? ? Iterator<String> nameIterator = names.iterator();
? ? // Iterate over all elements in the list
? ? while (nameIterator.hasNext()) {
? ? ? // Get the next element from the list
? ? ? String name = nameIterator.next();
? ? ? System.out.println(name);
? ? }
? }
}
上面的代碼生成以下結(jié)果。
remove()方法刪除?next()方法最后返回的元素。每次調(diào)用next()方法只能調(diào)用一次?remove()方法。
如果對于每個?next()方法或在第一次調(diào)用next()之前被多次調(diào)用?remove()方法,它會拋出一個IllegalStateException異常。
對?remove()方法的支持是可選的。remove()方法可能會拋出一個UnsupportedOperationException?異常。
例2
以下代碼使用迭代器遍歷列表的所有元素,并使用remove()方法刪除該元素。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
? public static void main(String[] args) {
? ? // Create a list of strings
? ? List<String> names = new ArrayList<>();
? ? names.add("A");
? ? names.add("B");
? ? names.add("C");
? ? Iterator<String> nameIterator = names.iterator();
? ? // Iterate over all elements in the list
? ? while (nameIterator.hasNext()) {
? ? ? // Get the next element from the list
? ? ? String name = nameIterator.next();
? ? ? System.out.println(name);
? ? ? nameIterator.remove();
? ? }
? ? System.out.println(names);
? }
}
上面的代碼生成以下結(jié)果。
例3
forEachRemaining()方法對集合中尚未由迭代器訪問的每個元素執(zhí)行操作。
action指定為?Consumer?。
以下代碼顯示如何打印列表的所有元素。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
? public static void main(String[] args) {
? ? // Create a list of strings
? ? List<String> names = new ArrayList<>();
? ? names.add("A");
? ? names.add("B");
? ? names.add("C");
? ? Iterator<String> nameIterator = names.iterator();
? ? nameIterator.forEachRemaining(System.out::println);
? }
}
上面的代碼生成以下結(jié)果。
迭代器注意事項
迭代器是一次性對象。我們不能重置迭代器,它不能被重用。
要再次遍歷同一集合的元素,請通過調(diào)用集合的iterator()方法來創(chuàng)建一個新的Iterator。
使用for-each循環(huán)
我們可以使用for-each循環(huán)遍歷集合的元素。
我們可以使用for-each循環(huán)遍歷任何實現(xiàn)類實現(xiàn)Iterable接口的集合。
for-each循環(huán)的一般語法如下:
Collection<T> yourCollection? = ;
for(T? element : yourCollection)? {
}
在幕后,for-each循環(huán)獲取迭代器并調(diào)用hasNext()和next()方法。
import java.util.ArrayList;
import java.util.List;
public class Main {
? public static void main(String[] args) {
? ? // Create a list of strings
? ? List<String> names = new ArrayList<>();
? ? names.add("A");
? ? names.add("B");
? ? names.add("C");
? ? for (String name : names) {
? ? ? System.out.println(name);
? ? }
? }
}
for-each注意事項
for-each循環(huán)有幾個限制。
我們不能使用for-each循環(huán)從集合中刪除元素。
以下代碼將拋出ConcurrentModificationException異常:
List<String> names = get? a? list;
for(String name : names)? {
? ? names.remove(name);// Throws a? ConcurrentModificationException
}
對于for-each循環(huán),我們沒有辦法從集合的中間開始。
for-each循環(huán)不提供訪問先前訪問的元素的方式。
使用forEach()方法
Iterable接口包含一個新的?forEach(Consumer action)方法。
該方法遍歷所有元素并應(yīng)用操作。
forEach()方法在從?Collection?接口繼承的所有集合類型中都可用。
import java.util.ArrayList;
import java.util.List;
public class Main {
? public static void main(String[] args) {
? ? // Create a list of strings
? ? List<String> names = new ArrayList<>();
? ? names.add("A");
? ? names.add("B");
? ? names.add("C");
? ? names.forEach(System.out::println);
? ? names.forEach((s -> {
? ? ? System.out.println(s);
? ? }));
? }
}