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); 