文章目录 1.迭代器简介 2. 迭代器方法 2.1. Iterator.hasNext() 2.2. Iterator.next() 2.3. Iterator.remove() 2.4. Iterator.forEachRemaining() 3. 迭代器示例 3.1……
文
章
目
录
- 1.迭代器简介
- 2. 迭代器方法
- 2.1. Iterator.hasNext()
- 2.2. Iterator.next()
- 2.3. Iterator.remove()
- 2.4. Iterator.forEachRemaining()
- 3. 迭代器示例
- 3.1. 遍历ArrayList
- 3.2. 遍历HashSet
- 3.3. 遍历Map的键和值
- 4. 将Iterator转换为Stream
- 5. 结论
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)的简单示例。
还没有评论呢,快来抢沙发~