新特性
- 1.default关键字
引入了新的关键字default,通过default修饰方法,可以让我们在接口里面定义具体的方法实现,如下:
如果接口的实现类实现这个接口以后,不用管这个default修饰的方法,也可以直接调用,如下:
JAVA学习之接口
所以说这个default方法是所有的实现类都不需要去实现的就可以直接调用。
注:
实现类就是实现接口中约定的内容。
意思是说,接口中定义规范,实现类来确定规范如何运行的。比如接口定义一个Person接口,定义了一个eat方法,这个吃的方法是空的。
那需要一个实现类比如ZhangSan类实现了Person接口,就必须要给定eat方法的具体实现,说明张三是如何吃的。
2.Lambda表达式
Lambda表达式是jdk1.8里面的一个重要的更新
特点:
1.使用Lambda必须有接口,并且接口中有且仅有一个抽象方法。
只有当接口中的抽象方法存在且唯一时,才可以使用Lambda,但排除接口默认方法以及声明中覆盖Object的公开方法。
2.使用Lambda必须具有上下文推断。
也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
标准格式由三部分组成:
一些参数
一个箭头
一段代码
lambda表达式本质上是一段匿名内部类,也可以是一段可以传递的代码
先来体验一下lambda最直观的优点:简洁代码
这里可以看到使用Lambda表达式可以大量节省代码。
Lmabda表达式的语法总结
口诀:左右遇一省括号,左侧推断类型省
注:当一个接口中存在多个抽象方法时,如果使用lambda表达式,并不能智******能匹配对应的抽象方法,因此引入了函数式接口的概念******
3.函数式接口
定义:“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。jdk1.8提供了一个@FunctionalInterface注解来定义函数式接口,如果我们定义的接口不符合函数式的规范便会报错。
语法格式:
修饰符 interface 接口名称 {
public abstract 返回值类型 方法名称(可选参数信息);
// 方法内容
}
4.方法与构造函数引用
jdk1.8提供了另外一种调用方式::,当 你 需 要使用 方 法 引用时 , 目 标引用 放 在 分隔符::前 ,方法 的 名 称放在 后 面 ,即ClassName :: methodName 。eg:
测试如下,可以以::形式调用:
5.Stream API
Stream操作的三个步骤:
创建stream
中间操作(过滤、map)
终止操作
5.1 特性
不是数据结构,没有内部存储。
不支持索引访问。
延迟计算
支持并行
很容易生成数据或集合
支持过滤,查找,转换,汇总,聚合等操作。
5.2 运行机制
Stream分为源source,中间操作,终止操作。
流的源可以是一个数组,集合,生成器方法,I/O通道等等。
一个流可以有零个或多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用,一个流只会有一个终止操作。
6.流
定义:流是Java API的新成员,它允许我们以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。就现在来说,我们可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,也就是说我们不用写多线程代码了。
流的构建方法:
总结:
jdk1.8相较于1.7以前有5方面的优化。
1、速度更快
2、代码更少(增加了新的语法Lambda表达式)
3、强大Stream API
4、便于并行
5、最大化减少空指针异常 OPtional