什么是函数式接口
先来看看传统的创建 线程 是怎么写的
再来看看使用了函数式接口是怎么写的
Threadt2=newThread(()->System.out.println(“t2”));t2.start();
Runnable接口直接可以使用Lambda表达式来编写,这是因为Runnable接口是一个函数式接口,来看看Runnable的源码。
@FunctionalInterfacepublicinterfaceRunnable{
publicabstractvoidrun();
}
发现该接口加上了函数式接口的定义注解: @FunctionalInterface
,表明该接口是一个函数式接口。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public@interfaceFunctionalInterface{}
在JDK8中,除了Runnbale接口,还有像Comparator、Callable等接口都加上了该注解定义为函数式接口。
内置函数式接口
JDK8提供了几个内置的函数式接口,用在了许多API的地方,都可以拿来用,可以满足大部分应用。
自定义函数式接口
1、自定义一个函数式接口
@FunctionalInterfacepublicinterfaceCalcInterface<N,V>{
Voperation(Nn1,Nn2);
}
这里只有一个抽象方法,@FunctionalInterface注解可以不用写,至于为什么可以往下看。
2、新建一个引用函数式接口的类
3、测试函数式接口
最后输出:
2313023130
函数式接口规范
1、@FunctionalInterface标识为一个函数式接口只能用在只有一个抽象方法的接口上。
2、接口中的静态方法、默认方法、覆盖了Object类的方法都不算抽象方法。
3、@FunctionalInterface注解不是必须的,如果该接口只有一个抽象方法可以不写,它默认就符合函数式接口,但建议都写上该注解,编译器会检查该接口是否符合函数式接口的规范。
举例说明
正确的函数式接口。
@FunctionalInterface
publicinterfaceCalcInterface<N,V>{
Voperation(Nn1,Nn2);
}
加了几个符合函数式的方法也没事,编译器也不会报错。
这个没用@FunctionalInterface函数式接口,有两个抽象方法,不能用于Lambda表达式。
publicinterfaceCalcInterface<N,V>{Voperation(Nn1,Nn2);Voperation2(Nn1,Nn2);}
这个有两个抽象方法的用@FunctionalInterface注解的函数式接口编译会报错。
@FunctionalInterface
publicinterfaceCalcInterface<N,V>{
Voperation(Nn1,Nn2);
Voperation2(Nn1,Nn2);
}
这个没有一个抽象方法,编译报错。
publicinterfaceCalcInterface<N,V>{}
推荐书籍
-
Spring Cloud微服务实战
-
JavaEE 开发的颠覆者 Spring Boot实战
-
SpringBoot揭秘 快速构建微服务体系
-
SpringBoot实战
-
精通Spring+4.x++企业应用开发实战
获取所有高清电子书下载请到274435854群。
推荐阅读
<<2017年,Java程序猿10本经典好书推荐>>
<<高级Java必看的10本书>>
<<Java架构师必看的10本书>>
看完有没有收获?分享到朋友圈给更多的人吧。
架构之路,头条精选,每天一篇干货,喜欢就收藏+关注吧!