1. Lambda 表达式
2. 函数式接口
除了含有单个抽象方法和 Object
中的 public
访问修饰符定义的方法外,不能再含有其它抽象方法。Java 中常见的 Comparator
便是一个很好的例子。尽管,Comparator
拥有两个抽象方法,但 equals
方法属于 Object
的公共方法,所以,Copmarator
仍可被视作函数式接口。
Lambda表达式就是一个函数式接口的实例。只要一个对象是函数式接口的实例,那么该对象就可以用Lambda表达式来表示。
java内置四大核心函数式接口:
3. 方法引用
方法引用也是一个语法糖,可以用来简化开发。
在我们使用 Lambda 表达式的时候,如果 “->” 的右边 要执行的表达式只是调用一个类已有的方法,那么就可以用方法引用来替代 Lambda 表达式。
方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
方法引用可以分为 4 类:引用静态方法;引用对象的方法;引用类的方法;引用构造方法。
4. Stream API
Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
Stream 和 Collection 集合的区别:
Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。
Stream 的操作三个步骤:
1.创建 Stream:一个数据源(如:集合、数组),获取一个流
2.中间操作:一个中间操作链,对数据源的数据进行处理
3.终止操作(终端操作):一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用
中间操作:
终止操作(终端操作):
5. Optional类
def:
Optional是一个可以为null的容器对象.可以保存指定类型的值,也可以只保存null. 要么有值,要么为null;
Optional中提供很多方法来避免显式的进行空值检查.如果值存在则调用isPresent() 方法会返回true, 调用get() 方法就会返回这个对象;
Optional类是一个没有子类的工具类,很好的解决了空指针异常问题
使用:
Java 8以前,通常使用if…else… 对对象进行是否为空的判断,然后再进行逻辑处理,这样的代码非常冗余
Java 8中新增了Optional类,使用这个类可以避免空指针检查,使代码更加优雅