行业资讯 2025年08月6日
0 收藏 0 点赞 795 浏览 3129 个字
摘要 :

文章目录 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)的简单示例。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9398.html

管理员

上一篇: Java泛型详解教程
下一篇: Java Comparator接口
相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号