# Java – 内部与外部迭代

> 原文： [https://howtodoinjava.com/java8/java-8-tutorial-internal-vs-external-iteration/](https://howtodoinjava.com/java8/java-8-tutorial-internal-vs-external-iteration/)

## 外部迭代

直到 Java 7 为止，[集合框架](//howtodoinjava.com/java/collections/useful-java-collection-interview-questions/ "Useful java collection interview questions")都依赖于外部迭代的概念，其中集合通过实现`Iterable`提供枚举其元素（即`Iterator`）的方法，并且客户端使用它顺序地遍历了集合。 例如，如果我们想将所有字符串都大写，则可以这样写：

```java
public class IterationExamples {
	public static void main(String[] args){
		List<String> alphabets = Arrays.asList(new String[]{"a","b","b","d"});

		for(String letter: alphabets){
			System.out.println(letter.toUpperCase());
		}
	}
}

```

或者我们可以这样写：

```java
public class IterationExamples {
	public static void main(String[] args){
		List<String> alphabets = Arrays.asList(new String[]{"a","b","b","d"});

		Iterator<String> iterator = alphabets.listIterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next().toUpperCase());
		}
	}
}

```

以上两个代码段均用于外部迭代。 外部迭代非常简单，但是存在几个问题：

1）Java 的`for-each`循环/迭代器本质上是顺序的，必须按集合指定的顺序处理元素。

2）它限制了管理控制流的机会，该控制流可能能够通过利用数据的重新排序，并行性，短路或惰性来提供更好的性能。

## 内部迭代

有时需要`for-each`循环的强力保证（顺序，顺序），但通常只是性能的劣势。 外部迭代的替代方法是内部迭代，客户端让它由库处理而不是控制迭代，而仅提供必须对所有/某些数据元素执行的代码。

上一个示例的内部迭代等效项是：

```java
public class IterationExamples {
	public static void main(String[] args){
		List<String> alphabets = Arrays.asList(new String[]{"a","b","b","d"});

		alphabets.forEach(l -> l.toUpperCase());
	}
}

```

在外部迭代将“做怎么”（大写）和“怎么做”（`for`循环/迭代器）混合使用的情况下，内部迭代使客户端仅提供“做怎么”，而由库控制“怎么做”。 这提供了许多潜在的好处：客户端代码可以更加清晰，因为它只需要关注于陈述问题，而不是解决问题的细节，并且我们可以将复杂的优化代码移到可以使所有用户受益的库中。

这就是关于内部与外部迭代的全部内容。

**祝您学习愉快！**