首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使用Iterator.forEachRemaining()和Iterable.forEach()有什么意义?

同时使用Iterator.forEachRemaining()和Iterable.forEach()有什么意义?
EN

Stack Overflow用户
提问于 2017-02-26 15:26:21
回答 2查看 17.7K关注 0票数 26

并且它们都获得了一个Consumer作为参数。那么,如果Java 8的目的是避免混淆,就像它在Time API中所做的那样,为什么它要添加新的混淆呢?还是说我漏掉了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-26 16:02:07

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

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

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

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

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

代码语言:javascript
复制
[1, 3, 6, 8, 0]

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

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

票数 90
EN

Stack Overflow用户

发布于 2021-05-17 12:28:55

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

在JDK8之前

代码语言:javascript
复制
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之后:

代码语言:javascript
复制
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()是带有lamda表达式的改进版本JDK7。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42465871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档