what's the point of having both Iterator.forEachRemaining() and Iterable.forEach()?

mostafa.S picture mostafa.S · Feb 26, 2017 · Viewed 14.8k times · Source

and both of them get a Consumer as parameter. so if Java 8, is meant to avoid confusions, like it has done in Time API, why has it added a new confusion? or am I missing some point?

Answer

Sweeper picture Sweeper · Feb 26, 2017

To understand why the two methods both exist, you need to first understand what are Iterator and Iterable.

An Iterator basically is something that has a "next element" and usually, an end.

An Iterable is something that contains elements in a finite or infinite sequence and hence, can be iterated over by keep getting the next element. In other words, Iterables can be iterated over by Iterators.

Now that you understand this, I can talk about what's the difference between the two methods in question.

Let's use an array list as an example. This is what is inside the array list:

[1, 3, 6, 8, 0]

Now if I call Iterable.forEach() and pass in System.out::print(), 13680 will be printed. This is because Iterable.forEach iterates through the whole sequence of elements.

On the other hand, if I get the Iterator of the array list and called next twice, before calling forEachRemaining with System.out::print(), 680 will be printed. The Iterator has already iterated through the first two elements, so the "remaining" ones are 6, 8 and 0.