使用迭代器
使用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()方法返回集合中的下一個元素。我們應該在調用?next()方法之前調用?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);
? ? }
? }
}
上面的代碼生成以下結果。
remove()方法刪除?next()方法最后返回的元素清寇。每次調用next()方法只能調用一次?remove()方法喘漏。
如果對于每個?next()方法或在第一次調用next()之前被多次調用?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);
? }
}
上面的代碼生成以下結果。
例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);
? }
}
上面的代碼生成以下結果衩藤。
迭代器注意事項
迭代器是一次性對象吧慢。我們不能重置迭代器,它不能被重用赏表。
要再次遍歷同一集合的元素检诗,請通過調用集合的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)獲取迭代器并調用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)方法。
該方法遍歷所有元素并應用操作牛欢。
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);
? ? }));
? }
}