接口的新特性
抽象方法
之前传统的方法且没有方法体
static方法
-
使用static修饰接口中的方法中必须有
方法体; -
只能够被接口本身调用(实现类能被接口调用的仅此一个);语法:接口名.方法名(...); -
不能被子接口继承; -
不能被实现类覆写及直接调用;
default方法(默认方法)
-
使用default修饰接口中的方法并且必须
有方法体; -
不能够被接口本身调用,需要接口的实例(实现类对象)来调用; -
可以被
子接口继承、覆写或者直接调用; -
可以被
实现类覆写及直接调用;
函数式接口
- 有且
仅有一个抽象方法的接口(只看抽象方法个数,与静态和默认方法个数无关), - 可以使用注解
@FunctionalInterface标记该接口为函数式接口
Lambda表达式
简述
简写的匿名内部类
Lambda语法
<函数式接口> <变量名> = (参数1,参数2...) -> {
//方法体
}
匿名内部类写法
写法一:常规写法(无参)
由匿名内部类变化而来,可以看做把方法列表和方法体抽离出来,具体是从=右边开始删除,删除到方法名,入参的()和方法体{}之间用->链接,方法体只有一句代码的时候,{}可以删除
例子
写法二:有参
没有返回值
- 如果只有
一个入参,入参的类型可以删除,入参的()可以删除
- 如果有
多个入参,入参类型可以删除(要删除就把参数类型全都删除),()不能删
有返回值
- 有返回值,并且方法体中只有
一句代码(传参变量),{}和return一起删除
方法引用
构造方法引用
语法:类名::New- 被构造方法与函数式接口的抽象方法参数列表一致
举例
- 第一步: 先创建一个提供两个参数的构造方法的类,如User类
- 第二步: 创建User对象的方法接口(命名为工厂UserFactory),提供一个获取User对象的抽象方法
- 创建一个工厂接口的实例
静态方法引用
语法:类名::静态方法名
注意事项
- 被引用的静态方法参数列表和函数式接口中抽象方法的参数一致
- 接口的 抽象方法没有返回值,引用的静态方法可以有返回值也可以灭有返回值
- 接口的抽象方法有返回值,引用的静态方法必须有相同类型的返回值
举例
- 准备一个函数式接口,提供一个解析字符串为int(即
把字符串转换为int)的方法
- 测试
常规Lambda写法
Lambda静态方法引用
实例方法(普通方法)
java提供了一个断言型函数式接口Function,接受两个参数
对象名::方法名
注意(和静态方法一样)
- 被引用的静态方法参数列表和函数式接口中抽象方法的参数一致
- 接口的 抽象方法没有返回值,引用的静态方法可以有返回值也可以灭有返回值
- 接口的抽象方法有返回值,引用的静态方法必须有相同类型的返回值 流式编程
举例
Stream流
是对集合Collection进行操作
首先的获取集合的流(使用对象名.stream()),下面所有方法都是需要在这基础上进行操作
常用方法
foreach(取出流中的每个数据)
迭代流中的每个数据 使用获取流的对象名.foreach(sout)
filter
筛选出符合条件的元素
map
获取每个元素到对应的结果
limit
获取指定数量的流,打印输入数量的数据
sorted
筛选年龄大于12的前两个人
注:要先进行筛选,然后才用Map
并行流parallelStream
- 上面的都是串行流(就像电路串联一样,电流流过一个负载没短路才能继续流向下一个负载)
- 只是把Stream换成parallelStream,方法和Stream一样
串行流和并行流的区别
- 串行流(保证数据的顺序) 并行流(效率高,不能保证数据顺序) ,因此并行流不能进行数据正常排序
串行流如果报异常,不容易发现是哪一个异常,排错困难
规约操作(Collectors)
- 将流转换为一个常用的类,方便别人使用
- 转换为List集合:在流最后使用Collect(Collectors.toList())
例子:(转换为字符串)
时间日期
Optional容器类
介绍
是一个可以为null的容器类
常用方法
| 方法 | 描述 |
|---|---|
| Optional.ofNullable(T t) | 若t不为null,创建Optional实例,否则创建空的实例 |
| isPresent() | 判断是否包含值 |
| orElse(T t) | 如果调用对象包含值,返回该值,否则返回t |
| Optional.ofNullable(T t) |