Java Iterator 迭代器接口

后端 潘老师 7个月前 (10-16) 133 ℃ (0) 扫码查看

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.panziye.com/back/9699.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】