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?
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, Iterable
s can be iterated over by Iterator
s.
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.