Java 函数式编程:进阶篇
函数式编程是一种将计算视为数学函数求值的编程范式,避免改变状态和可变数据。Java 作为一门面向对象语言,自 Java 8 起获得了强大的函数式编程工具:Lambda 表达式、Stream API 和函数式接口。在进阶层面,这些能力使得编写更简洁、安全且富有表现力的代码成为可能,尤其是在处理集合、异步操作和错误处理时。
本文将探讨 Java 中的进阶函数式编程技术:函数组合、Monad(Optional 和 CompletableFuture)、支持并行处理的 Stream API 以及柯里化。
1. 函数组合与函数式接口
在 Java 中,函数式接口是指仅包含一个抽象方法(SAM)的接口。最常用的包括:Function<T, R>、Predicate<T>、Consumer<T> 和 Supplier<T>。其高级用法包括通过 andThen() 和 compose() 方法实现函数组合。
示例:转换链
import java.util.function.Function;
public class FunctionComposition { public static void main(String[] args) { // 函数:字符串 -> 其长度 Function<String, Integer> lengthFunction = String::length; // 函数:数字 -> 其平方 Function<Integer, Integer> squareFunction = x -> x * x;
// 组合:字符串 -> 长度 -> 长度的平方 Function<String, Integer> composedFunction = lengthFunction.andThen(squareFunction);
String text = "Hello, Java!"; int result = composedFunction.apply(text); // 12 * 12 = 144 System.out.println("Result: " + result); // 144 }}andThen() 方法先应用第一个函数,再应用第二个。compose() 则相反:先应用传入的函数,再应用第一个。这允许构建灵活且可复用的转换链。
实战示例:过滤并转换列表
import java.util.List;import java.util.function.Function;import java.util.function.Predicate;import java.util.stream.Collectors;
public class PredicateAndFunction { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie", "David", "Eve");
Predicate<String> startsWithA = s -> s.startsWith("A"); Function<String, String> toUpperCase = String::toUpperCase;
List<String> result = names.stream() .filter(startsWithA) .map(toUpperCase) .collect(Collectors.toList());
System.out.println(result); // [ALICE] }}2. Java 中的 Monad:Optional 和 CompletableFuture
Monad 是一种设计模式,它封装一个值并提供一系列操作来转换该值,而无需显式解包。在 Java 中,Monad 通过 Optional(用于处理空值)和 CompletableFuture(用于异步操作)实现。
Optional 作为 Monad
map()、flatMap() 和 filter() 方法允许对可能缺失的值进行链式操作。
import java.util.Optional;
public class OptionalMonad { public static void main(String[] args) { // 创建一个包含非空值的 Optional Optional<String> optional = Optional.of("Hello");
// 转换链 String result = optional .filter(s -> s.length() > 3) // 过滤 .m