其实这个时间点还来谈 JDK 1.8 的新特性是有点不合时宜的,毕竟 JDK 都出到几了,但是在大环境下(国内,国外不知道),只要 Spring 不出致命漏洞,JDK 1.8 在 2026 年之前还是主流,毕竟谁没事去重构老系统,新系统开发可遇不可求
函数式编程 / lambda
比如获取最小值的实现方式
之前,啰嗦
1 | int[] a = {0, 1, 2, 3, -1, -2, 10}; |
之后
1 | System.out.println(IntStream.of(a).min().getAsInt()); |
函数接口
1 |
只能有一个待实现的方法(可有很多默认方法)
函数式编程
可链式调用
接口 | 输入参数 | 返回类型 | 说明 |
---|---|---|---|
Predicate | T | boolean | 断言 |
Consumer | T | 无 | 消费一个数据 |
Function<T, R> | T | R | 输入 T 输出 R 的函数 |
Supplier | 无 | T | 提供一个数据 |
UnaryOperator | T | T | 一元函数(输入输出类型相同) |
BiFunction<T, U, R> | (T, U) | R | 2 个输入相同的函数 |
BinaryOperator | (T, T) | T | 二元函数(输入输出类型相同) |
基本数据类型的演变
Predicate
方法引用
非静态方法,使用对象的实例来引用
使用类名来访问,因为 JDK 自带了第一个参数在方法里,内容是 this(不显示),所以用 BiFunction
1 | Consumer<String> consumer = System.out::println; |
构造函数的方法引用
Java 是值传递
类型推断
变量引用
JDK 1.8 之前,匿名函数内部访问外部的变量,外部变量要为 final;lambda 则可不写 final(但变量不能改,否则编译出错)
Stream 流编程
- 外部迭代:fori
- 内部迭代:并行流