Java 什么';It’同时拥有Iterator.forEachRemaining()和Iterable.forEach()的意义是什么?

Java 什么';It’同时拥有Iterator.forEachRemaining()和Iterable.forEach()的意义是什么?,java,foreach,iterator,iterable,Java,Foreach,Iterator,Iterable,它们都得到一个消费者作为参数。所以,如果Java8是为了避免混淆,就像它在Time API中所做的那样,为什么它添加了一个新的混淆呢?还是我遗漏了一些要点?要理解这两种方法为什么都存在,您需要首先了解什么是迭代器和Iterable 一个迭代器基本上是有一个“下一个元素”并且通常有一个结束的东西 Iterable是包含有限或无限序列中的元素的东西,因此可以通过不断获取下一个元素来迭代。换句话说,Iterables可以被Iterators迭代 既然你理解了这一点,我可以谈谈这两种方法的区别 让我们以

它们都得到一个消费者作为参数。所以,如果Java8是为了避免混淆,就像它在Time API中所做的那样,为什么它添加了一个新的混淆呢?还是我遗漏了一些要点?

要理解这两种方法为什么都存在,您需要首先了解什么是
迭代器
Iterable

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

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

既然你理解了这一点,我可以谈谈这两种方法的区别

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

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


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

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

JDK8之前
List fruits=new ArrayList();
水果。添加(“苹果”);
水果。添加(“香蕉”);
水果。添加(“葡萄”);
水果。添加(“橙色”);
迭代器迭代器=水果。迭代器();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
现在在JDK8中,如果我们想要遍历任何集合,我们可以这样做:

JDK8之后:
List fruits=new ArrayList();
水果。添加(“苹果”);
水果。添加(“香蕉”);
水果。添加(“葡萄”);
水果。添加(“橙色”);
迭代器迭代器=水果。迭代器();
迭代器.forEachRemaining((fruit)->System.out.println(fruit));
现在,JDK8 forEach()是带有lamda表达式的改进版JDK7


您是否正在尝试比较
迭代器
Iterable
@别这样,伙计们,别把西红柿扔到我身上!我明白了:好吧。谢谢你清晰完整的回答。好的,但是forEach()和foreachreserving()的区别在哪里呢@Malachiasz我回答的哪一部分你不明白
forEach
遍历
Iterable
的元素
forEachRemaining
遍历
迭代器的剩余元素。在我的链接示例中,forEach也遍历剩余元素。还是我使用的Kotlin中的forEach()与Java中的Iterable.forEach()不同?@Malachiasz啊。。。我不明白你所说的链接是什么意思。这个答案是关于Java的
Iterable.forEach
vs
Iterator.forEachRemaining
。我不是科特林的专家。在Kotlin中,
Iterator
似乎还有一个
forEach
方法,其工作原理与
foreachrestain
完全相同。如果你想得到更准确的信息,我建议你问一个新问题。
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());
}
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));