函数式接口(Functional Interface) :任何接口,如果只包含唯一 一个抽象方法,那么它就是一个FI。(之前它们被称为 SAM类型,即 单抽象方法类型(Single Abstract Method))。接口中的方法默认就是public abstract的。
接口可能继承了一个 Object 已经提供的方法,比如 toString(),equals( )…这些都不属于函数式接口方法的范畴, 所以函数式接口中所说的方法不包括这些。
可以通过 @FunctionalInterface 注解来显式指定一个接口是函数式接口。加上这个注解,接口中函数式接口方法少于一个或者多余一个,编译器都会提示错误。
其实我们之前写的接口实例化就是函数式接口的实例化。
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为lambda表达式。
函数式接口可以现有的函数友好地支持 lambda。
JDK 1.8之前已有的函数式接口:
java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
JDK 1.8 新增加的函数接口:
java.util.function
java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:
//Predicate接口 代码示例:
@Test
public void test7(){
List list = Arrays.asList(11, 22, 33, 14, 15, 66, 7, 18, 19);
//Predicate接口 常用test方法 存在则 test 方法返回 true
Predicate predicate=n->n%2==1;
for(Integer i:list) {
if(predicate.test(i)){
System.out.println("奇数:"+i);
}
}
}
private int getSum(int n1, int n2, BiFunction biFunction){
return biFunction.apply(n1,n2);
}
//BiFunction 接受两个参数 返回一个结果
@Test
public void test8(){
System.out.println("求余数:"+getSum(13,3,(n1,n2)->n1%n2));
}
千锋Java培训作为中国IT研发人才一体化服务的开拓者,为学生制定合理有序的学习计划,2周免费试听不满意不收费,与学员签订就业协议,坚持良心面授,从千锋Java培训班出去的学员均已高薪就业。千锋推出的免费Java视频教程,让学员能够更好的巩固基础技术能力。