同时拥有Iterator.forEachRemaining()和Iterable.forEach()的重点是什么?

时间:2017-02-26 07:26:21

标签: java foreach iterator iterable

并且它们都获得Consumer作为参数。因此,如果Java 8是为了避免混淆,就像它在Time API中所做的那样,为什么它会增加一个新的混乱?或者我错过了一些观点?

2 个答案:

答案 0 :(得分:39)

要了解这两种方法都存在的原因,您需要先了解IteratorIterable是什么。

Iterator基本上是具有“下一个元素”的东西,通常是结束。

Iterable包含有限或无限序列中的元素,因此可以通过继续获取下一个元素来迭代。换句话说,Iterable s可以迭代Iterator

现在您已经理解了这一点,我可以谈谈这两种方法之间的区别。

我们以数组列表为例。这就是数组列表中的内容:

[1, 3, 6, 8, 0]

现在,如果我致电Iterable.forEach()并传递System.out::print(),则会打印13680。这是因为Iterable.forEach遍历整个元素序列。

另一方面,如果我获得数组列表的Iterator并且两次调用next,则在使用forEachRemaining调用System.out::print()之前,680将打印。 Iterator已遍历前两个元素,因此“剩余”元素为6,8和0。

答案 1 :(得分:0)

简单来说,forEachRemaining() 是 Iterator 的改进版本,在 JDK8 之前我们使用 hasNext()、next() 来遍历任何集合(ArrayList、HastSet 等)。

JDK8 之前

List<String> fruits= new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Grapes");
fruits.add("Orange");
Iterator<String> iterator = fruits.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

现在在 JDK8 中,如果我们想要遍历任何集合,我们可以这样做:

JDK8 之后:

List<String> fruits=new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Grapes");
fruits.add("Orange");

Iterator<String> iterator = fruits.iterator();
iterator.forEachRemaining((fruit) -> System.out.println(fruit));
<块引用>

现在,JDK8 forEach() 是 JDK7 的改进版,带有 lamda 表达式。