Lambda expressions in Java 8 enable functional programming and allow code blocks to be treated as values. They provide a more readable and concise syntax than traditional anonymous classes. Lambdas improve APIs and support parallel processing. Functional programming separates code from objects and allows independent functions. Lambda expressions infer types from functional interfaces and can implement interfaces like Runnable more concisely than anonymous classes. Java 8 defines functional interfaces to have a single abstract method to be compatible with lambdas. Common functional interfaces include Predicate and Consumer. Streams and Optional are new classes that work with lambdas to support functional-style operations on collections and optional values.