Lambda expressions, described and demonstrated in the previous chapter, together with functional interfaces added a powerful functional programming capability to Java. They allow passing behavior (functions) as parameters to libraries optimized for the performance of the data processing. This way, an application programmer can concentrate on the business aspects of the developed system, leaving the performance aspects to the specialists – the authors of the library. One example of such a library is java.util.stream, which is going to be the focus of this chapter.
In Chapter 5, Strings, Input/Output, and Files, we talked about I/O streams as the source of data, but beyond that, they are not of much help for the further processing of the data. And they are byte- or character-based, not object-based. You can create a stream of objects...