Lesson 23 of 25

Lambda Expressions

Lambda Syntax

Lambda expressions (Java 8+) provide a concise way to implement functional interfaces — interfaces with a single abstract method.

Example
import java.util.*;
import java.util.function.*;

// Without lambda
Comparator<String> comp1 = new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return a.length() - b.length();
    }
};

// With lambda
Comparator<String> comp2 = (a, b) -> a.length() - b.length();

// Common functional interfaces
Predicate<Integer> isEven = n -> n % 2 == 0;
Function<String, Integer> toLength = s -> s.length();
Consumer<String> printer = s -> System.out.println(s);
Supplier<Double> random = () -> Math.random();

Streams API

The Streams API (Java 8+) enables functional-style operations on collections — filter, map, reduce, and more.

Example
List<String> names = List.of("Alice", "Bob", "Charlie", "David", "Eve");

// Filter and collect
List<String> longNames = names.stream()
    .filter(n -> n.length() > 3)
    .collect(Collectors.toList());
// ["Alice", "Charlie", "David"]

// Map and collect
List<String> upper = names.stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

// Reduce
int totalLength = names.stream()
    .mapToInt(String::length)
    .sum();

// Chaining
names.stream()
    .filter(n -> n.startsWith("A") || n.startsWith("C"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);