# java8中接口的变化
## 1.函数式接口
- 函数式接口是jdk1.8版本后才有的说法,其实就是普通的接口,但是这个普通接口只有1个抽象方法,像下面这样
``` java
public interface BlacklistHandler {
void handle(T t);
}
```
- jdk1.8还定义了一个注解类 `@FunctionalInterface` 用于定义函数式接口,如果某个接口有多个抽象方法,是无法添加 `@FunctionalInterface` 注解的。
``` java
@FunctionalInterface
public interface Consumer {
void accept(T t);
```
- 新增的`@FunctionalInterface`注解主要用于编译级别的错误检查。
- 函数式接口可以直接通过lambda表达式创建,例如
``` java
Consumer consumer = message -> System.out.println(message);
consumer.accept("message");
```
java8提供了很多常用的函数式接口,全部在 `java.util.function` 包下面,最常用的是下面这几个
| 函数接口 | 函数方法 | 功能 |
| --- | --- | --- |
| Consumer\ | void accept(T t) | 消费消息,Steamm里面的peek方法 |
| Function\ | R apply(T t) | 类型转换,Steam里面的map方法 |
| BiFunction\ | R apply(T t, U u) | Function增强,传入两个类型参数,返回其他类型|
| Predicate\ | boolean test(T t) | 判断真假,Steam里面的filter方法 |
| Supplier\ | T get() | 无中生有 Steam里面的collect,generate方法 |
| UnaryOperator\ | T apply(T t) | 继承Function, 但是只能返回同类型数据, Steam.iterate |
| BinaryOperator\ | T apply(T t, T u) | 继承 BiFunction, 但是类型统一,Steam.reduce |
``` java
//无中生有
Supplier supplier = () -> 1;
//自己生成流
List list = Stream.generate(supplier).limit(10).collect(Collectors.toList());
//[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
System.out.println(list);
//UnaryOperator继承Function,唯一的区别是它只返回同类型数据
UnaryOperator unaryOperator = n -> n + 3;
//iterate也可以生成数据流
List collect = Stream.iterate(0, unaryOperator).limit(10).collect(Collectors.toList());
//[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
System.out.println(collect);
//function可以做类型转换
Function function = num -> num + 1;
//Consumer
Consumer peek = num -> {
if (num > 25) {
System.out.println(num + "大于25");
}
};
//真假判断
Predicate predicate = num -> num != 7;
BinaryOperator binaryOperator = (item, next) -> (item + next);
int result = collect.stream()
.map(function)
.peek(peek)
.filter(predicate)
.reduce(0, binaryOperator);
//138
System.out.println(result);
```
虽然之前没有注意过,但其实一直在使用这些函数式接口。
## 2.default方法
jdk里面有些接口的实现类很多并且这些类都会有一些常用的方法,比如 List里面的sort就很常用。
在jdk1.8之前,如果要给接口新增方法时,那么这个接口所有的实现类都需要重写这个方法。
为了向后兼容,jdk1.8版本开始,接口类可以定义普通方法了, 但是这些方法要用default关键词修饰
1. default方法可以被重写,但是不强制的
2. default方法对原有接口做了增强,但是又不会影响到既有代码的逻辑,比如 List.sort方法就是1.8新增的
本文主要介绍了Java8中接口的一些重要变化,包括函数式接口的概念及其应用,以及新增的default方法如何增强了接口的功能,同时保持了向后兼容性。
248

被折叠的 条评论
为什么被折叠?



