Java 8 in Action: Lambdas, streams, and functional-style programming (2015)
Part I. Fundamentals
Chapter 1. Java 8: why should you care?
Chapter 2. Passing code with behavior parameterization
Part II. Functional-style data processing
Chapter 4. Introducing streams
Chapter 5. Working with streams
Chapter 6. Collecting data with streams
Chapter 7. Parallel data processing and performance
Part III. Effective Java 8 programming
Chapter 8. Refactoring, testing, and debugging
Chapter 10. Using Optional as a better alternative to null
Chapter 11. CompletableFuture: composable asynchronous programming
Chapter 12. New Date and Time API
Part IV. Beyond Java 8
Chapter 13. Thinking functionally
Chapter 14. Functional programming techniques
Chapter 15. Blending OOP and FP: comparing Java 8 and Scala
Chapter 16. Conclusions and where next for Java
Appendix A. Miscellaneous language updates
Appendix B. Miscellaneous library updates
Appendix C. Performing multiple operations in parallel on a stream
Appendix D. Lambdas and JVM bytecode