代码更少(增加了新的语法 Lambda 表达式),速度更快,强大的 Stream API, 便于并行, 最大化减少空指针异常 Optional
其中核心为: Lambda 表达式与 Stream API
升级改动:
-
HashMap
- 数组 --> 链表 = 红黑树
- 当元素容量大于 64 并且链表长度大于 8 ,转换为 红黑树 [除了添加操作以外都比链表效率高]
-
ConcurrentHashMap
- JDK8前:concurrentLevel = 16 ,锁分段机制
- JDK8:CAS算法(无锁算法)
-
JVM空间
- 没有了永久区 PermGen 使用 Meta Space 元空间的概念,并且使用物理内存分配空间,会 GC ,发生条件苛刻。
PermGenSize、MaxPremGen在JDK1.8已经无效,取而代之的是 MetaSpaceSize 、MaxMetaSpaceSize
1. Lambda表达式
-
Lmabda 表达式的基础语法:Java8中引入了一个新的操作符 " -> " (箭头操作符 OR Lambda 操作符)
-
箭头操作符 " -> " 将表达式拆分成两部分
- 左侧: Lambda 表达式的参数列表
- 右侧: Lambda 表达式所需执行的功能,即 Lambda 体
-
语法格式
- 无参数,无返回值:
() -> System.out.println("Helld Lambda!");
- 一个参数,无返回值:
(param) -> System.out.println(param);
- 只有一个参数时,小括号可省略
param -> System.out.println(param);
- 只有一个参数时,小括号可省略
- 两个参数以上,有返回值,Lambda 体中只有一条语句,return 关键字和花括号可以省略
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
- 两个参数以上,有返回值,Lambda 体中有多条语句,使用花括号
Comparator<Integer> com = (x, y) -> { System.out.println("Functional Interface"); return Integer.compare(x, y); };
- 无参数,无返回值:
-
Lambda 表达式参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文推断出数据类型,这个过程被称为 “类型推断”。
2. 函数式接口
Lambda 表达式需要"函数式接口的支持"
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口
可以用注解 @Functional Interface修饰,可以检查是否是函数式接口
Java8 内置的四大核心函数式接口
Consumer<T> :消费型接口
void accept(T t);
Supplier<T> :供给型接口
T get();
Function<T, R> :函数式接口
R apply(T t);
Predicate<T> : 断言式接口
boolean test(T t);
3. 方法引用与构造器引用
若 Lambda 体中的内容有方法有方法已经实现了,可以使用方法引用
方法引用主要有三种语法格式
- 对象 :: 实例方法名
- 类 :: 实例方法名
- 类 :: 静态方法名
注意: Lambda体中调用方法参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致!
若 Lambda 参数列表中第一参数是 实例方法的调用者,第二参数是实例方法的参数时,可以使用 ClassName :: method