Java8 新特性

代码更少(增加了新的语法 Lambda 表达式),速度更快,强大的 Stream API, 便于并行, 最大化减少空指针异常 Optional

其中核心为: Lambda 表达式与 Stream API

升级改动:

  • HashMap

    • 数组 --> 链表 = 红黑树
    • 当元素容量大于 64 并且链表长度大于 8 ,转换为 红黑树 [除了添加操作以外都比链表效率高]
  • ConcurrentHashMap

    • JDK8前:concurrentLevel = 16 ,锁分段机制
    • JDK8:CAS算法(无锁算法
  • JVM空间

    • 没有了永久区 PermGen 使用 Meta Space 元空间的概念,并且使用物理内存分配空间,会 GC ,发生条件苛刻。
    • PermGenSizeMaxPremGen 在JDK1.8已经无效,取而代之的是 MetaSpaceSizeMaxMetaSpaceSize

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 体中的内容有方法有方法已经实现了,可以使用方法引用

方法引用主要有三种语法格式

  1. 对象 :: 实例方法名
  2. :: 实例方法名
  3. :: 静态方法名

注意: Lambda体中调用方法参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致!

若 Lambda 参数列表中第一参数是 实例方法的调用者,第二参数是实例方法的参数时,可以使用 ClassName :: method

4. Stream API

image-20220721183628459

5. 接口中的默认方法与静态方法

6. 新时间日期API

7. 其他新特性

WRITTEN BY:    Richard

I'm discombobulated !