Java 8 新增了很多的功能和语法
Lambda
初识 Lambda 表达式
- 基本语法
() -> {}
(Integer x, Integer y) -> { return x + y; }
(x, y) -> { return x + y; }
可以省略类型 Lambda 支持自动推导(x, y) -> x + y
单行可以省略return
和;
- Lambda 可以简化冗长的代码 明确表达的意思
1
2
3
4
5
6
7
8
9// 原来 我们在线程执行一行代码的时候至少需要4行代码新建一个匿名类
new Thread(new Runnable() {
public void run() {
System.out.println("Lambda");
}
}).start();
// 使用 Lambda 表达式 只需要一行即可 -> 是 Lambda 的语法
new Thread(() -> System.out.println("Lambda")).start(); - Lambda 表达式支持类型推导 不需要指定参数类型
1
2
3
4
5
6
7
8
9
10
11
12
13Map<String, Object> map = new HashMap<>();
// 老方法循环
for (Map.Entry entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// 使用 forEach 循环
map.forEach((String s, Object o) -> {
System.out.println(s + ": " + o);
});
// 简写语法 当只有一行的时候 可以去掉括号
map.forEach((String s, Object o) -> System.out.println(s + ": " + o));
// 简写语法 可以忽略类型
map.forEach((s, o) -> System.out.println(s + ": " + o));
Lambda 的相关接口和注解
- 注解
@FunctionalInterface
表示这是一个函数式接口 - 函数式接口基本都在
java.util.function
包下 - 函数型接口
- 特点 有入参 有出参
- 接口
Function<T, R>
BiFunction<T, U, R>
- 接口
- 用于
map
flatMap
等处理函数
- 特点 有入参 有出参
- 消费型接口
- 特点 有入参 没有出参
- 类似接口
Consumer<T>
BiConsumer<T, U>
- 类似接口
- 用于
forEach
peek
等处理函数
- 特点 有入参 没有出参
- 断言型接口
- 特点 有入参 出参 Boolean 类型
- 接口
Predicate<T>
BiPredicate<T, U>
- 接口
- 用于
filter
等过滤函数
- 特点 有入参 出参 Boolean 类型
- 供应型接口
- 特点 没有入参 有出参
- 接口
Supplier<T>
- 接口
- 用于生产类的函数
- 特点 没有入参 有出参
Stream 流处理
什么是 Stream
- Stream 是元素的集合
- Stream 支持顺序和并行对元素进行汇聚的操作
初识 Stream
使用 Stream 处理一个数字列表
1
2List<Integer> nums = Arrays.asList(1, 2, 3);
nums.stream().filter(num -> num != null).count();- 红色区域 创建了一个 Stream
- 绿色区域 把一个 Stream 转换为另一个 Stream
- 三色区域 聚合数据
如何创建 Stream
- 在 Java8 中 所有实现了
java.util.Collection
接口的集合类 可以通过stream()
方法转换为Stream
- 例如
Map
List
Set
Queue
等
- 例如
- 数组类型和基础类型 可以通过
java.util.Arrays#stream(T[])
方法转换为Stream