# Java `Iterator`接口示例

> 原文： [https://howtodoinjava.com/java/collections/java-iterator/](https://howtodoinjava.com/java/collections/java-iterator/)

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

## 1\. Java `Iterator`接口

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

```java
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() );
}

```

程序输出。

```java
A
B
C
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`**](https://howtodoinjava.com/java-arraylist/)元素的 Java 示例。

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

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

System.out.println(list);

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

//Iterate over all elements
while(iterator.hasNext()) 
{
    //Get current element
    String value = iterator.next();

    System.out.println( value );

    //Remove element
    if(value.equals("B")) {
        iterator.remove();
    }
}

System.out.println(list);

```

程序输出：

```java
[A, B, C, D]
A
B
C
D
[A, C, D]

```

#### 3.2 `HashSet`迭代示例

遍历[**`HashSet`**](https://howtodoinjava.com/java/collections/java-hashset/)与遍历列表非常相似。 无明显差异。

```java
HashSet<String> hashSet = new HashSet<>();

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

System.out.println(hashSet);

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

//Iterate over all elements
while(iterator.hasNext()) 
{
    //Get current element
    String value = iterator.next();

    System.out.println( value );

    //Remove element
    if(value.equals("B")) {
        iterator.remove();
    }
}

System.out.println(list);

```

程序输出：

```java
[A, B, C, D]
A
B
C
D
[A, C, D]

```

#### 3.3 `HashMap`键迭代器示例

迭代[**`HashMap`**](https://howtodoinjava.com/java-hashmap/)的键的 Java 示例。

```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) );
}

```

程序输出：

```java
{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 示例。

```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() );
}

```

程序输出：

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

```

#### 3.5 `Iterator forEachRemaining()`示例

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

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

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

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

```

程序输出：

```java
A
B
C
D

```

## 4\. 将迭代器转换为流

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

```java
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);
	}
}

```

程序输出：

```java
a
b
c

```

## 5\. 总结

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

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

学习愉快！

参考文献：

[`Iterator`接口 Java 文档](https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html)