Functional Java: A Guide to Lambdas and Functional Programming in Java 8