Given this code:
@Test
public void test() throws Exception
{
Iterator<Integer> iterator = Stream
.of(0, 2)
.flatMap(x -> Stream.of(x, x + 1))
.map(element -> {
System.out.println("Stream generating element: " + element);
return element;
})
.iterator();
while (iterator.hasNext())
{
Integer value = iterator.next();
System.out.println("Iterated value: " + value);
}
}
What I expected to see:
Stream generating element: 0
Iterated value: 0
Stream generating element: 1
Iterated value: 1
Stream generating element: 2
Iterated value: 2
Stream generating element: 3
Iterated value: 3
What I actually see:
Stream generating element: 0
Stream generating element: 1
Iterated value: 0
Iterated value: 1
Stream generating element: 2
Stream generating element: 3
Iterated value: 2
Iterated value: 3
We had been relying on Stream#iterator()
returning a lazy iterator, but it seems that in some situations, such as this one, it walks more elements than you have asked for. This is catastrophic if, for example, retrieving the next element requires making a multicast DNS request, which would take 6 seconds to come back.
Is there a way to avoid this and get a truly lazy iterator without implementing my own iterator manually somehow (something which I'm not entirely sure how to even do)?