Java 8 及以后版本引入了多种函数式编程特性,使得开发者可以编写更简洁、优雅和高效的代码。以下是一些主要的函数式编程特性:
1. Lambda 表达式(Lambda Expressions)
Lambda 表达式是匿名函数,可以作为参数传递给方法或存储在变量中。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
2. 函数式接口(Functional Interfaces)
函数式接口是只包含一个抽象方法的接口,可以用作 Lambda 表达式的类型。
@FunctionalInterface
interface MyFunctionalInterface {
void execute();
}
MyFunctionalInterface func = () -> System.out.println("Hello, World!");
func.execute();
3. 方法引用(Method References)
方法引用是 Lambda 表达式的一种简写形式,可以引用现有的方法。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println);
4. Stream API
Stream API 提供了一种声明性方式来处理集合数据,支持链式调用和并行操作。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
5. Optional 类
Optional 类用于表示可能为空的值,避免了显式的空值检查。
Optional<String> optionalName = Optional.of("Alice");
optionalName.ifPresent(name -> System.out.println(name));
6. 默认方法(Default Methods)
接口可以包含默认实现的方法,允许接口演化而不破坏现有实现。
interface MyInterface {
void existingMethod();
default void newDefaultMethod() {
System.out.println("New default method");
}
}
7. 静态方法(Static Methods)
接口可以包含静态方法,提供通用的工具方法。
interface MyInterface {
static void staticMethod() {
System.out.println("Static method in interface");
}
}
MyInterface.staticMethod();
8. CompletableFuture
CompletableFuture 提供了异步编程的支持,允许以非阻塞的方式处理并发任务。
CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(result -> result + ", World!")
.thenAccept(System.out::println);
9. Collectors
Collectors 是一个实用工具类,提供了多种用于汇总和收集 Stream 元素的方法。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
String joinedNames = names.stream()
.collect(Collectors.joining(", "));
System.out.println(joinedNames); // 输出 "Alice, Bob, Charlie"
10. 新的日期和时间 API
Java 8 引入了新的日期和时间 API,提供了更好的日期和时间操作支持。
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1990, Month.JANUARY, 1);
Period age = Period.between(birthday, today);
System.out.println("Age: " + age.getYears());
通过这些特性,Java 8 及以后版本大大增强了对函数式编程的支持,使得开发者可以编写更简洁和高效的代码,同时保持 Java 语言的稳定性和兼容性。