The document discusses functional programming and lambda expressions in Java 8. It begins by defining functional programming and predicates from predicate logic. It then discusses the key properties of functional programming including no states, passing control, single large function, and no cycles. The document provides examples of determining if a number is prime in both imperative and declarative styles using Java 8 lambda expressions. It also provides examples of getting the first doubled number greater than 3 from a list using both declarative and imperative approaches. The examples demonstrate the use of streams, filters, maps and other functional operations.