what's the point of having both Iterator.forEachRemaining() and Iterable.forEach()?
Solution 1
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.
Solution 2
In Simple word, forEachRemaining() is an improved version of Iterator, where before JDK8 we were uses hasNext(), next() to traverse the any collection(ArrayList, HastSet etc).
Before JDK8
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());
}
Now In JDK8 if we want to we want to traverse any collection we can do like this:
After JDK8:
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));
Now, JDK8 forEach() is improved version JDK7 with lamda expression.
Related videos on Youtube
Comments
-
mostafa.S almost 2 years
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?
-
Naman about 7 years
-
mostafa.S about 7 years@JBNizet all right guys, don't throw tomatoes on me! I got it :D
-
-
mostafa.S about 7 yearsall right. thanks for your clear and complete answer.
-
Malachiasz over 3 yearsOk, but where is the difference between forEach() and forEachRemaining() ? pl.kotl.in/ehW6pBa5t
-
Sweeper over 3 years@Malachiasz What part of my answer did you not understand?
forEach
iterates through the elements of anIterable
.forEachRemaining
iterates through the remaining elements of anIterator
. -
Malachiasz over 3 yearsIn my linked sample forEach iterates also through the remaining elements. Or does forEach() in Kotlin I used is not the same as Iterable.forEach() in Java?
-
Sweeper over 3 years@Malachiasz Ah... I didn't understand what you meant by the link. Well, this answer is about Java's
Iterable.forEach
vsIterator.forEachRemaining
. I am not an expert in Kotlin. It appears that in Kotlin,Iterator
also has aforEach
method that works exactly likeforEachRemaining
. I suggest you ask a new question if you want more accurate info on that.