Java 8 中的函数式接口

用户头像
陈皮
关注
发布于: 2020 年 07 月 27 日

解决了什么问题

让 Java 支持函数做为参数。



Java 中函数参数只允许传递数据或者对象,不能传递函数。想要实现类似传递函数的功能,需要定义一个接口,约定接口中有一个函数会被调用,使用时传递的是 new 了该接口实现类的一个对象,其实是面向接口编程。



Java 8 中引入了 Lambda 表达式,一种语法糖,Java 编译器会解析成对应的类。Lambda 表达式本质上就是一个接口的匿名实现对象实例。



定义了 @FunctionalInterface 注解,添加该注解 Java 编译器就认可该接口为函数式接口,可以做为 Lambda 表达式使用。



Java 8 默认实现了四种 Functional Interfaces。



Java 8 里四种默认定义的函数接口

为了适配 Lambda 表达式,根据参数和返回值不同,定义了四种接口。





@FunctionalInterface 的使用

1 声明定义 @FunctionalInterface 接口

Predicate



@FunctionalInterface
public interface Predicate<T> {

boolean test(T t);

...
}


2 定义函数,以函数式接口为参数,调用约定方法

Java Collection



default boolean removeIf(Predicate<? super E> filter) {
...
while (each.hasNext()) {
if (filter.test(each.next())) {
...
}
}
return removed;
}


3 方法调用

...

Collection<XXX> collection = ...;

collection.removeIf(new Prediate<XXX>() {
@Override
public boolean test(XXX xxx) {
return xxx.isTrue();
}
});

...


lambda 写法



...

Collection<XXX> collection = ...;
collection.removeIf(xxx -> xxx.isTrue());

...



发布于: 2020 年 07 月 27 日 阅读数: 6
用户头像

陈皮

关注

还未添加个人签名 2018.04.26 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
请加“极客大学架构师训练营”标签,便于分类
2020 年 07 月 27 日 16:58
回复
没有更多了
Java 8 中的函数式接口