Java8新特性:速度更快,代码更少,stream API,便于并行,最大化减少空指针异常:Optional
Lambda表达式
好处:
Lambda是一个匿名函数,可以把lambda表达式理解为一段可以传递的代码,写出更简洁,更灵活的代码,使得Java语言表达能力得到提高
函数式接口
具有SAM特性的接口(Single abstract method):
- 使得以这种类型的接口为参数时,可以使用Lambda表达式为参数,底层可以进行解析,不影响功能,减少代码量
- 函数式接口必定使用@FunctionalInterface进行修饰
注解:@FunctionalInterface
SAM原则的两个意外情况:
- 抽象类的默认方法和静态方法并不影响函数式接口的契约,可以随意使用
- 可以有Object重写的方法,toString() hashcode(),equals()方法
Java四大核心函数式接口
名称 | 函数式 | 参数类型 | 返回值 | 用途 |
消费型接口 | Consumer< T > | T | void | |
供给型接口 | Supplier< T > | |||
断定型接口 | Predicate< T > | |||
函数型接口 | Function<T,R> |
Lambda基本语法
格式:
- 无参无返回值:
- 无参有返回值:
- 有参无返回值:
- 有参有返回值:
四大类核心的函数式接口:
JDK1.8中的optional
背景 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。
Optional类是一个容器类,代表一个值存在还是不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
常用方法:
- Optional.of(T t):创建一个optional对象实例,t不能为null
- Optional.empty():创建一个空的optional实例对象
- Optional.ofNullable(T t):t可以为null,若不为null创建实例,否则创建optional空实例
- isPresent()是否包含值
- T get():如果调用对象包含值,则返回,否则抛出异常
- orElse(): 有值返回,否则返回指定值
- orElseGet():与orElse()类似,区别在于得到的默认值,orElseGe()通过Supplier的接口的默认实现生成返回值
- orElseThrow():如果有值则将其返回,否则抛出supplier接口创建的异常