Java函数式编程:高级技巧与Stream API

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

博客

书籍推荐