原文: https://howtodoinjava.com/java/collections/java-iterator/

Java 迭代器接口,用于迭代集合中的元素(列表,集合或映射)。 它有助于一个接一个地检索指定的收集元素,并对每个元素执行操作。

1. Java Iterator接口

所有 Java 集合类都提供iterator()方法,该方法返回迭代器的实例以遍历该集合中的元素。 例如,arraylistiterator()方法以适当的顺序返回此列表中元素的迭代器。

  1. ArrayList<String> list = new ArrayList<>();
  2. list.add("A");
  3. list.add("B");
  4. list.add("C");
  5. list.add("D");
  6. Iterator<String> iterator = list.iterator();
  7. while(iterator.hasNext()) {
  8. System.out.println( iterator.next() );
  9. }

程序输出。

  1. A
  2. B
  3. C
  4. D

2. Java Iterator方法

2.1 Iterator hasNext()

  • 如果迭代在集合中剩余更多元素,则此方法返回true
  • 如果迭代器遍历了所有元素,则此方法将返回false

2.2 Iterator next()

  • 此方法返回迭代中的下一个元素。
  • 如果迭代中没有更多元素,则抛出 NoSuchElementException

2.3 Iterator remove()

  • 它从基础集合中删除迭代器返回的最后一个元素(可选操作)。
  • 每次调用next()只能调用一次此方法。
  • 如果在迭代进行过程中以其他方式(而不是通过调用remove()方法)修改了基础集合,则迭代器将抛出ConcurrentModificationException
  • 执行此操作的迭代器称为快速失败迭代器,因为它们快速而干净地失败,而不是冒着在未来未定时间冒任意,不确定行为的风险。

2.4 Iterator forEachRemaining()

  • 此方法对其余的每个元素执行给定的操作,直到所有元素都已处理或该操作引发异常为止。
  • 如果指定了顺序,则按照迭代顺序执行操作。
  • 如果指定的操作为null,则抛出NullPointerException

3. Java Iterator示例

3.1 ArrayList迭代示例

遍历ArrayList元素的 Java 示例。

  1. ArrayList<String> list = new ArrayList<>();
  2. list.add("A");
  3. list.add("B");
  4. list.add("C");
  5. list.add("D");
  6. System.out.println(list);
  7. //Get iterator
  8. Iterator<String> iterator = list.iterator();
  9. //Iterate over all elements
  10. while(iterator.hasNext())
  11. {
  12. //Get current element
  13. String value = iterator.next();
  14. System.out.println( value );
  15. //Remove element
  16. if(value.equals("B")) {
  17. iterator.remove();
  18. }
  19. }
  20. System.out.println(list);

程序输出:

  1. [A, B, C, D]
  2. A
  3. B
  4. C
  5. D
  6. [A, C, D]

3.2 HashSet迭代示例

遍历HashSet与遍历列表非常相似。 无明显差异。

  1. HashSet<String> hashSet = new HashSet<>();
  2. hashSet.add("A");
  3. hashSet.add("B");
  4. hashSet.add("C");
  5. hashSet.add("D");
  6. System.out.println(hashSet);
  7. //Get iterator
  8. Iterator<String> iterator = hashSet.iterator();
  9. //Iterate over all elements
  10. while(iterator.hasNext())
  11. {
  12. //Get current element
  13. String value = iterator.next();
  14. System.out.println( value );
  15. //Remove element
  16. if(value.equals("B")) {
  17. iterator.remove();
  18. }
  19. }
  20. System.out.println(list);

程序输出:

[A, B, C, D]
A
B
C
D
[A, C, D]

3.3 HashMap键迭代器示例

迭代HashMap的键的 Java 示例。

HashMap<Integer, String> map = new HashMap<>();

map.put(1, "A");
map.put(2, "B");
map.put(3, "C");
map.put(4, "D");

System.out.println(map);

//Get iterator
Iterator<String> iterator = map.keys().iterator();

//Iterate over all keys
while(iterator.hasNext()) 
{
    String key = iterator.next();
    System.out.println( "Key : " + key + ", Value : " + map.get(key) );
}

程序输出:

{1=A, 2=B, 3=C, 4=D}
Key : 1, Value : A
Key : 2, Value : B
Key : 3, Value : C
Key : 4, Value : D

3.4 HashMap值迭代器示例

遍历HashMap值的 Java 示例。

HashMap<Integer, String> map = new HashMap<>();

map.put(1, "A");
map.put(2, "B");
map.put(3, "C");
map.put(4, "D");

System.out.println(map);

//Get iterator
Iterator<String> iterator = map.values().iterator();

//Iterate over all values
while(iterator.hasNext()) 
{
    System.out.println( "Value : " + iterator.next() );
}

程序输出:

{1=A, 2=B, 3=C, 4=D}
Value : A
Value : B
Value : C
Value : D

3.5 Iterator forEachRemaining()示例

Java 示例,它遍历ArrayList元素并对它们执行操作。

ArrayList<String> list = new ArrayList<>();

list.add("A");
list.add("B");
list.add("C");
list.add("D");

list.iterator().forEachRemaining( System.out::println );

程序输出:

A
B
C
D

4. 将迭代器转换为流

首先将迭代器转换为Spliterator,然后使用StreamSupportSpliterator获取流,从而将迭代器转换为流。

import java.util.Arrays;
import java.util.Iterator;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public class IteratorToStream 
{
    public static void main(String[] args) 
    {
        // Iterator
        Iterator<String> iterator = Arrays.asList("a", "b", "c")
                                            .listIterator();
        //Extra step to get 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);
    }
}

程序输出:

a
b
c

5. 总结

在本教程中,我们学习了 Java Iterator接口。 我们学习了迭代器方法和简单示例来迭代ListSetMap之类的不同集合。

将我的问题放在评论部分。

学习愉快!

参考文献:

Iterator接口 Java 文档