同时拥有 Iterator.forEachRemaining() 和 Iterable.forEach() 有啥意义?

Posted

技术标签:

【中文标题】同时拥有 Iterator.forEachRemaining() 和 Iterable.forEach() 有啥意义?【英文标题】:what's the point of having both Iterator.forEachRemaining() and Iterable.forEach()?同时拥有 Iterator.forEachRemaining() 和 Iterable.forEach() 有什么意义? 【发布时间】:2017-07-16 21:25:50 【问题描述】:

他们都得到一个消费者作为参数。所以如果 Java 8 是为了避免混淆,就像它在 Time API 中所做的那样,为什么它会增加新的混淆?还是我错过了什么?

【问题讨论】:

你想比较IteratorIterable吗? ***.com/questions/6863182/… @JBNizet 好吧,伙计们,别把西红柿扔给我!我明白了:D 【参考方案1】:

要了解这两种方法为什么都存在,首先需要了解IteratorIterable是什么。

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

Iterable 包含有限或无限序列中的元素,因此可以通过不断获取下一个元素来迭代。换句话说,Iterables 可以被Iterators 迭代。

既然你明白了这一点,我可以谈谈这两种方法有什么区别。

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

[1, 3, 6, 8, 0]

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

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

【讨论】:

好的。感谢您清晰而完整的回答。 好的,但是 forEach() 和 forEachRemaining() 的区别在哪里? pl.kotl.in/ehW6pBa5t @Malachiasz 你不明白我回答的哪一部分? forEach 遍历 Iterable 的元素。 forEachRemaining 遍历 Iterator 的剩余元素。 在我的链接示例中,forEach 还遍历了剩余的元素。还是我使用的 Kotlin 中的 forEach() 和 Java 中的 Iterable.forEach() 不一样? @Malachiasz 啊...我不明白链接的意思。好吧,这个答案是关于 Java 的 Iterable.forEachIterator.forEachRemaining。我不是 Kotlin 的专家。似乎在 Kotlin 中,Iterator 也有一个 forEach 方法,其工作方式与 forEachRemaining 完全相同。如果您想获得更准确的信息,我建议您提出一个新问题。【参考方案2】:

简单来说,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 表达式。

【讨论】:

以上是关于同时拥有 Iterator.forEachRemaining() 和 Iterable.forEach() 有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章

如何在同时拥有 64 位和 32 位版本的同时安装 64 位软件包?

同时拥有多个位置提供商

我怎样才能拥有一个同时包含图像和文本的 UIBarButtonItem?

VSTO - 是不是可以同时拥有设计器和 XML 功能区?

React DnD - “不能同时拥有两个 HTML5 后端。”

pthread_rwlock 可以同时拥有多少个读者?