JDK1.8新特性

其实这个时间点还来谈 JDK 1.8 的新特性是有点不合时宜的,毕竟 JDK 都出到几了,但是在大环境下(国内,国外不知道),只要 Spring 不出致命漏洞,JDK 1.8 在 2026 年之前还是主流,毕竟谁没事去重构老系统,新系统开发可遇不可求

函数式编程 / lambda

比如获取最小值的实现方式

之前,啰嗦

1
2
3
4
5
6
7
8
int[] a = {0, 1, 2, 3, -1, -2, 10};
int min = Integer.MAX_VALUE;
for (int i : a) {
if (i < min) {
min = i;
}
}
System.out.println(min);

之后

1
System.out.println(IntStream.of(a).min().getAsInt());

函数接口

1
@FunctionalInterface

只能有一个待实现的方法(可有很多默认方法)

函数式编程

可链式调用

接口输入参数返回类型说明
PredicateTboolean断言
ConsumerT消费一个数据
Function<T, R>TR输入 T 输出 R 的函数
SupplierT提供一个数据
UnaryOperatorTT一元函数(输入输出类型相同)
BiFunction<T, U, R>(T, U)R2 个输入相同的函数
BinaryOperator(T, T)T二元函数(输入输出类型相同)

基本数据类型的演变

Predicate-> IntPredicate,其他的类似

方法引用

非静态方法,使用对象的实例来引用

使用类名来访问,因为 JDK 自带了第一个参数在方法里,内容是 this(不显示),所以用 BiFunction

1
Consumer<String> consumer = System.out::println;

构造函数的方法引用

Java 是值传递

类型推断

变量引用

JDK 1.8 之前,匿名函数内部访问外部的变量,外部变量要为 final;lambda 则可不写 final(但变量不能改,否则编译出错)

Stream 流编程

  • 外部迭代:fori
  • 内部迭代:并行流