This document discusses functional programming with streams in Java. It defines streams as sequences of data elements that support sequential and parallel aggregate operations. It outlines different stream operations like intermediate and terminal operations. It also describes how to create streams from various sources like collections, arrays and files. Additionally, it explains how to apply common stream operations like mapping, filtering, matching, grouping and partitioning data.