Java函数式编程实战总结
Java函数式编程(Functional Programming)是一种应用程序设计范式,其核心概念是函数与函数之间的组合,以及不可变数据结构和 的函数,以减少代码复杂性和提高代码可维护性。Java 8 对函数式编程提供了大力支持,引入了函数式接口、Lambda 表达式、流(Stream)等新特性。本文将介绍 Java 函数式编程的实战应用。
函数式接口
在 Java 8 中提供了许多函数式接口,它们是只有一个抽象方法的接口,通常可以通过 Lambda 表达式或方法引用来创建该接口的实例,例如:Runnable、Comparator、Consumer、Function、Predicate 等接口。我们可以使用 @FunctionalInterface 标注来强制检查是否满足函数式接口的要求。例如:
@FunctionalInterface
public interface Foo<T> {
void foo(T t);
default void bar() {} // 接口中可以包含默认方法
}
Lambda 表达式
Lambda 表达式是一个匿名函数,可以在内联上下文中使用。Lambda 表达式的语法非常简洁,包含以下几个部分:形式参数列表,箭头符号,Lambda 主体,例如:
// 无参 Lambda 表达式
() -> System.out.println("Hello, world!");
// 有参 Lambda 表达式
(x, y) -> x + y
// 代码块 Lambda 表达式
(int x, int y) -> {
int result = x + y;
return result;
}
Lambda 表达式可以作为方法参数,也可以作为变量使用,例如:
// 使用 Lambda 表达式作为方法参数
Arrays.asList(1, 2, 3).forEach(x -> System.out.println(x));
// 使用 Lambda 表达式作为变量
Runnable r = () -> System.out.println("Hello, world!");
流
Java 8 中的流是一个元素序列,支持顺序和并行处理,可以通过各种操作来转换和计算。流的操作可以分为中间操作和终端操作两种,中间操作会返回一个新的流对象,终端操作会产生一个非流的结果。例如:
// 获取 List 中所有偶数的集合
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
// 通过流计算字符串数组中所有字符的长度总和
String[] words = {"hello", "world", "java"};
int totalLength = Arrays.stream(words)
.mapToInt(String::length)
.sum();
方法引用
方法引用是一种简化 Lambda 表达式的语法,可以通过方法的名称来简洁地实现 Lambda 表达式所代表的功能。方法引用可以分为四种:
- 静态方法引用:类名::staticMethod
- 实例方法引用:对象::instanceMethod
- 构造方法引用:类名::new
- 数组构造方法引用:Type[]::new
例如:
// 静态方法引用 Arrays.asList(1, 2, 3).forEach(System.out::println); // 实例方法引用 String str = "hello"; Function<Integer, Character> func = str::charAt; // 构造方法引用 Supplier<List<Integer>> supplier = ArrayList::new; // 数组构造方法引用 Function<Integer, int[]> creator = int[]::new;
并发编程
Java 8 中的并发编程也得到了大力强化,新增了许多并发原语和工具类,例如 CompletableFuture、Stream.parallel()、Atomic 相关类和 ConcurrentHashMap 等。我们可以使用 CompletableFuture 实现并行请求多个 Http 请求:
public List<String> fetch(List<String> urls) {
return urls.stream()
.map(url -> CompletableFuture.supplyAsync(() -> request(url)))
.map(CompletableFuture::join)
.collect(Collectors.toList());
}
总结
Java 函数式编程是一种强大的编程范式,它能使代码更加简洁高效,减少错误发生概率,提高代码可重用性和可维护性。本文介绍了 Java 函数式编程中的函数式接口、Lambda 表达式、流、方法引用和并发编程等实战应用,希望对读者有所帮助。
