两个方法都接受一个 Consumer 参数。如果 Java 8 的目的是避免混淆(例如在 Time API 中做的那样),为什么它又增加了新的混淆呢?或者我漏掉了什么重要的点?
Iterator
和 Iterable
。
Iterator
基本上是具有“下一个元素”和通常还有一个结束的东西。
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。
forEach
遍历Iterable
的元素。forEachRemaining
遍历Iterator
的剩余元素。 - SweeperIterable.forEach
与Iterator.forEachRemaining
之间的区别。我不是Kotlin的专家。看起来在Kotlin中,Iterator
也有一个forEach
方法,它的工作方式与forEachRemaining
完全相同。如果您想获得更准确的信息,请提出一个新问题。 - Sweeper简单来说,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);
Iterator
的forEach
方法被称为forEachRemaining
(而Iterable
有一个forEach
方法)。对@Sweeper答案的补充评论:
forEach
是针对Iterable
的,它对应于“集合”,因此“for each”就是“对集合中的每个元素进行操作”。
forEachRemaing
是针对Iterator
的,它对应于指针。指针后面可能有一个“集合”,也可能没有;“对指针的每个元素进行操作”不是有效的语句。
Iterator
е’ҢIterable
еҗ—пјҹhttps://dev59.com/questions/GGw15IYBdhLWcg3wCnYn - Naman