函数接口
前言
最近在项目中发现了同事写的代码,用到了很多Java8的特性,本篇就写关于函数式接口的;
正文
函数式接口
什么是函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为lambda
表达式。Lambda
表达式和方法引用(实际上也可认为是Lambda表达式)上。
函数式接口
可以将lambda表达式作为参数传入方法,并处理;
函数接口注解@FunctionalInterface
该注解主要起一个标记校验作用,在编译时校验该接口是否遵循函数式接口规则;
Java 不会强制要求你使用@FunctionalInterface
注解来标记你的接口是函数式接口, 然而,作为API作者, 你可能倾向使用@FunctionalInterface
指明特定的接口为函数式接口, 这只是一个设计上的考虑, 可以让用户很明显的知道一个接口是函数式接口。
未违反规则:
@FunctionalInterface
public interface TestFunc {
void test();
}
违反规则:
注解规则
- 可以定义默认方法
- 允许定义静态方法
- 允许定义
java.lang.Object
里面的public
方法
jdk8之前已有的函数式接口
java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
ava.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener
新定义的函数式接口
集中在java.util.function
包下边;
Predicate
-- 传入一个参数,返回一个bool结果, 方法为boolean test(T t)Consumer
-- 传入一个参数,无返回值,纯消费。 方法为void accept(T t)Function
-- 传入一个参数,返回一个结果,方法为R apply(T t)Supplier
-- 无参数传入,返回一个结果,方法为T get()
自定义函数式接口
- 自定义函数式接口类:
@FunctionalInterface
public interface AnnotationFunc {
/**
* 注释执行方法回调
*/
void callBack();
}
- 使用函数式接口类
public class TestTwo {
public static void main(String[] args) {
//赋值函数
AnnotationFunc annotationFunc=()-> System.out.println("test");
//调用方法执行
annotationFunc.callBack();
}
}
- 结果
test
Process finished with exit code 0
总结
这里大概的了解了Java8的函数式编程,可以将函数(lambda
表达式)作为参数传递