拥有Iterator.forEachRemaining()和Iterable.forEach()有什么意义?(涉及IT技术)

35
两个方法都接受一个 Consumer 参数。如果 Java 8 的目的是避免混淆(例如在 Time API 中做的那样),为什么它又增加了新的混淆呢?或者我漏掉了什么重要的点?

3
дҪ жҳҜеңЁиҜ•еӣҫжҜ”иҫғIteratorе’ҢIterableеҗ—пјҹhttps://dev59.com/questions/GGw15IYBdhLWcg3wCnYn - Naman
1
@JBNizet 好了,各位,别往我身上扔番茄了!我懂了 :D - mostafa.S
4个回答

106
为了理解这两种方法为什么都存在,你需要先了解什么是 IteratorIterableIterator 基本上是具有“下一个元素”和通常还有一个结束的东西。 Iterable 是包含元素序列的有限或无限对象,因此可以通过不断获取下一个元素来进行迭代。换句话说,Iterable 可以被 Iterator 迭代。
现在你已经了解了这一点,我可以谈论一下这两种方法之间的区别。
让我们以数组列表为例。这是数组列表中的内容:
[1, 3, 6, 8, 0]

现在,如果我调用Iterable.forEach()并传入System.out::print(),将打印出13680。这是因为Iterable.forEach遍历了所有的元素。

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


1
好的,谢谢你清晰而完整的回答。 - mostafa.S
3
好的,但是forEach()和forEachRemaining()之间有什么区别?https://pl.kotl.in/ehW6pBa5t - Malachiasz
1
@Malachiasz,你不理解我的回答的哪一部分?forEach遍历Iterable的元素。forEachRemaining遍历Iterator的剩余元素。 - Sweeper
在我的链接示例中,forEach() 迭代了剩余的元素。或者我使用的 Kotlin 中的 forEach() 和 Java 中的 Iterable.forEach() 不同吗? - Malachiasz
1
@Malachiasz 啊...我不明白你所说的链接是什么意思。好吧,这个答案是关于Java的Iterable.forEachIterator.forEachRemaining之间的区别。我不是Kotlin的专家。看起来在Kotlin中,Iterator也有一个forEach方法,它的工作方式与forEachRemaining完全相同。如果您想获得更准确的信息,请提出一个新问题。 - Sweeper

2

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

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

在JDK8之前

while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

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

JDK8之后

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

现在,JDK8的forEach()是使用lambda表达式改进的JDK7版本。

0
简单总结一下,对于Scala和Kotlin用户来说:在Java中,IteratorforEach方法被称为forEachRemaining(而Iterable有一个forEach方法)。

0

对@Sweeper答案的补充评论:

forEach是针对Iterable的,它对应于“集合”,因此“for each”就是“对集合中的每个元素进行操作”。

forEachRemaing是针对Iterator的,它对应于指针。指针后面可能有一个“集合”,也可能没有;“对指针的每个元素进行操作”不是有效的语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接