List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
List twoEvenSquares = numbers.stream().filter(n -> {
System.out.println(\"
Streams are pull-based. Only a terminal operations (like the collect) will cause items to be consumed.
Conceptually this means that collect will ask an item from the limit, limit from the map and map from the filter, and filter from the stream.
Schematically the code in your question leads to
collect
limit (0)
map
filter
stream (returns 1)
/filter (false)
filter
stream (returns 2)
/filter (true)
/map (returns 4)
/limit (1)
limit (1)
map
filter
stream (returns 3)
/filter (false)
filter
stream (returns 4)
/filter (true)
/map (returns 16)
/limit (2)
limit (2)
/limit (no more items; limit reached)
/collect
And this conforms to your first printout.