文
章
目
录
章
目
录
Java Iterator接口用于遍历Collection(List、Set或Map)的元素。迭代器有助于逐个从指定集合中检索元素,并可以选择对每个元素执行操作。
Java Iterator首次在Java 1.2中引入,以替代Enumerations。请注意,除了ListIterator之外,它不保证其他集合类型的迭代顺序。
1.迭代器简介
所有Java集合类提供iterator()方法,该方法返回Iterator的实例,以便遍历该集合中的元素。例如,ArrayList.iterator()方法返回一个按照ArrayList中元素的适当顺序进行遍历的迭代器。
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
System.out.println( iterator.next() );
}
2. 迭代器方法
Iterator接口有4个方法用于执行各种操作:
- hasNext()
- next()
- remove()
- forEachRemaining()
2.1. Iterator.hasNext()
- 此方法在集合中仍有更多元素需要迭代时返回true。
- 如果迭代器已经遍历了所有元素,那么此方法将返回false。
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
Iterator<Integer> iterator = numbers.iterator();
boolean result = iterator.hasNext(); //true
2.2. Iterator.next()
- 此方法返回迭代中的下一个元素。
- 如果迭代没有更多元素,它将引发NoSuchElementException异常。
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
Iterator<Integer> iterator = numbers.iterator();
int number = iterator.next(); //1
int number = iterator.next(); //2
2.3. Iterator.remove()
- 它从迭代器返回的最后一个元素中删除底层集合(可选操作)。
- 此方法每次调用next()方法后只能调用一次。
- 如果在迭代进行中以除了调用remove()方法之外的任何方式修改了底层集合,迭代器将引发ConcurrentModificationException。
- 执行此操作的迭代器被称为快速失败迭代器,因为它们能够快速、干净地失败,而不是冒险在未来的不确定时间出现任意、非确定性的行为。
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
Iterator<Integer> iterator = numbers.iterator();
int number = iterator.next(); //1
iterator.remove();
System.out.println(numbers); [2, 3, 4, 5]
2.4. Iterator.forEachRemaining()
- 此方法对每个剩余元素执行给定的操作,直到处理完所有元素或操作引发异常为止。
- 如果指定了顺序,操作将按迭代顺序执行
- 如果指定的操作为null,它将引发NullPointerException。
在下面的示例中,我们将Lambda表达式作为forEachRemaining()方法的参数传递。
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
Iterator<Integer> iterator = numbers.iterator();
while(iterator.hasNext()) {
iterator.forEachRemaining(System.out::println); //1 2 3 4 5
}
3. 迭代器示例
3.1. 遍历ArrayList
Java示例,用于遍历ArrayList元素。
ArrayList<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();
while(iterator.hasNext())
{
String value = iterator.next();
//对元素执行操作
}
3.2. 遍历HashSet
遍历HashSet与遍历List非常相似。没有明显的区别。
HashSet<String> set = new HashSet<>();
Iterator<String> iterator = set.iterator();
while(iterator.hasNext())
{
String value = iterator.next();
//对元素执行操作
}
3.3. 遍历Map的键和值
Java示例,用于遍历HashMap的键和值。
HashMap<Integer, String> map = new HashMap<>();
//Iterating over map keys
Iterator<String> iterator = map.keys().iterator();
while(iterator.hasNext())
{
String key = iterator.next();
System.out.println( "Key : " + key + ", Value : " + map.get(key) );
}
//遍历 map values
Iterator<String> iterator = map.values().iterator();
while(iterator.hasNext())
{
System.out.println( "Value : " + iterator.next() );
}
4. 将Iterator转换为Stream
我们可以通过首先将迭代器转换为Spliterator,然后使用StreamSupport从Spliterator获取流来将迭代器转换为流。
// Iterator
Iterator<String> iterator = Arrays.asList("a", "b", "c").listIterator();
//获取Spliterator的额外步骤
Spliterator<String> splitItr = Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED);
// Iterator -> Stream
Stream<String> stream = StreamSupport.stream(splitItr, false);
// Apply stream operations
stream.forEach(System.out::println);
5. 结论
在本教程中,我们学习了Java Iterator接口。我们学习了迭代器方法以及用于遍历不同集合类型(如List、Set和Map)的简单示例。