写在前面
随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程。
本文的目标是带领大家熟悉Java 8中集合框架新增的常用接口,让我们的代码更简洁、更高级。
本文的示例代码可从gitee上获取,完整文章获取,搜索关注公众号,员说:
Java中的函数式编程示例代码https://gitee.com/cnmemset/javafphttps://gitee.com/cnmemset/javafp
Java 8中的集合框架
首先,和大家从整体上了解Java集合框架。
Java集合框架,主要是由两个根接口派生出来的:一个是 Collecton接口,用于存放单个元素;另一个是 Map 接口,主要用于存放键值对。
Java集合框架的接口继承结构如下图:
Java 8中,主要是Collection、List和Map三个接口新增了一些方法,部分常用的新增函数如下表所示:
接口名 |
Java8新加入的方法 |
Collection |
forEach(), removeIf(), stream(), parallelStream() |
List |
replaceAll(), sort() |
Map |
forEach(), replaceAll(), compute(), computeIfAbsent(), computeIfPresent(), merge() |
上述这些函数,它们都包含一个函数式接口类型的参数。这类函数有一个专门的术语:高阶函数(high order function)。
高阶函数(定义):
一个函数,如果它有一个或多个参数是函数类型的,或者它的返回值是函数类型的,那么我们称这个函数为高阶函数。
题外话:
可以发现,这些新增的方法基本都有默认实现(default implementation),这大大减少了具体子类的负担。接口中的默认方法是Java 8的新特性,一个重要的作用就是“接口演化(interface evolution)”。举例说明,假设在Java 8之前,我们有一个类实现了Collection接口:
public class Container implements Collection { ... }
升级到Java 8后,因为Collection中新增了方法 forEach,假设没有默认方法,之前的类 Container 将编译失败。
Collection中的高阶函数
1. forEach
严格来说,forEach方法是定义在接口 Iterable 中的,它的方法签名和默认实现是:
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
它的作用是遍历集合中的每一个元素,然后依次对每个元素执行参数 action 指定的动作。参数 action 是一个 Consumer 类型的函数式接口,我们可以通过lambda表达式或方法引用来实现一个 Consumer 。因此,在Java 8或以后的版本中,不要用 for 语句来迭代 Collection 了,不妨使用 forEach 方法。
示例代码如下:
public static void collectionForEach() {
Collection<String> list = Array