Chapter 3. Streams
The language changes introduced in Java 8 are intended to help us write better code. New core libraries are a key part of that, so in this chapter we start to look at them. The most important core library changes are focused around the Collections API and its new addition: streams. Streams allow us to write collections-processing code at a higher level of abstraction.
The Stream interface contains a series of functions that we’ll explore throughout this chapter, each of which corresponds to a common operation that you might perform on a Collection.
From External Iteration to Internal Iteration
Tip
A lot of the examples in this chapter and the rest of the book refer to domain classes, which were introduced in Example Domain.
A common pattern for Java developers when working with collections is to iterate over a collection, operating on each element in turn. For example, if we wanted to add up the number of musicians who are from Liverpool, we would write the code in Example 3-1.
intcount=0;for(Artistartist:allArtists){if(artist.isFrom("Liverpool")){count++;}}
There are several problems with this approach, though. It involves a lot of boilerplate code that needs to be written every time you want to iterate over the collection. It’s also hard to write a parallel version of this for loop. You would need to rewrite every for loop individually in order to make them operate in parallel.
Finally, the ...