java8的接口_java8中接口的变化

本文主要介绍了Java8中接口的一些重要变化,包括函数式接口的概念及其应用,以及新增的default方法如何增强了接口的功能,同时保持了向后兼容性。

# 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新增的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值