java8新特性_数据

1. Lambda 表达式

() -> {}

// () 参数, Lambda表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。
// -> Lambda 操作符或箭头操作符
// {} 抽象方法

2. 函数式接口

@FunctionalInterface
interface Comparator<T> {
boolean equals(Object obj);
int compare(T o1, T o2);
}

除了含有单个抽象方法和 ​​Object​​​ 中的 ​​public​​​ 访问修饰符定义的方法外,不能再含有其它抽象方法。Java 中常见的 ​​Comparator​​​ 便是一个很好的例子。尽管,​​Comparator​​​ 拥有两个抽象方法,但 ​​equals​​​ 方法属于 ​​Object​​​ 的公共方法,所以,​​Copmarator​​ 仍可被视作函数式接口。

Lambda表达式就是一个函数式接口的实例。只要一个对象是函数式接口的实例,那么该对象就可以用Lambda表达式来表示。

java8新特性_抽象方法_02

java内置四大核心函数式接口:

java8新特性_函数式接口_03

3. 方法引用

方法引用也是一个语法糖,可以用来简化开发。

在我们使用 Lambda 表达式的时候,如果 “->” 的右边 要执行的表达式只是调用一个类已有的方法,那么就可以用方法引用来替代 Lambda 表达式。

方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。

方法引用可以分为 4 类:引用静态方法;引用对象的方法;引用类的方法;引用构造方法。

1.引用静态方法    类::静态方法
2.引用对象的方法 对象::实例方法
3.引用类的方法 类::实例方法
4.引用构造方法 类::new
5.引用数组 数组类型[]::new

4. Stream API

Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

Stream 和 Collection 集合的区别:
Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。

Stream 的操作三个步骤:

1.创建 Stream:一个数据源(如:集合、数组),获取一个流

2.中间操作:一个中间操作链,对数据源的数据进行处理

3.终止操作(终端操作):一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用

中间操作

java8新特性_抽象方法_04

java8新特性_数据_05

java8新特性_jvm_06

终止操作(终端操作)

java8新特性_jvm_07

java8新特性_数据_08

java8新特性_数据_09

java8新特性_jvm_10

5. Optional类

def:
Optional是一个可以为null的容器对象.可以保存指定类型的值,也可以只保存null. 要么有值,要么为null;

Optional中提供很多方法来避免显式的进行空值检查.如果值存在则调用isPresent() 方法会返回true, 调用get() 方法就会返回这个对象;

Optional类是一个没有子类的工具类,很好的解决了空指针异常问题

使用:
Java 8以前,通常使用if…else… 对对象进行是否为空的判断,然后再进行逻辑处理,这样的代码非常冗余
Java 8中新增了Optional类,使用这个类可以避免空指针检查,使代码更加优雅