函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
函数式接口都添加了 @FunctionalInterface 注解,这个是jdk1.8才引进的。例如
因为函数式接口里面只是提供了一个抽象的方法,所以在使用时,一般都会使用 lambda 表达式,这个也是jdk1.8才引进的
在JDK中,常见的函数式接口分为四类,分别是
- 消费型函数式接口 Consumer 常用于遍历 void accpet(T t)
- 供给型函数式接口 Supplier 用于产生数据 == T get() ==
- 断言型函数式接口 Predicate 用于判断 == boolean test(T t) ==
- 函数型函数式接口 Function<T,R> 用于逻辑处理 == R apply(T t) ==
Consumer
可以看出 Consumer函数式接口提供的抽象方法为 void accept(T t),有参数,没有返回值。具体的使用方法如下:
public static void main(String[] args) {
Consumer consumer = new Consumer<Object>() {
@Override
public void accept(Object o) {
System.out.println("o = " + o);
}
};
consumer.accept("我是消费式函数接口");
}
//运行结果
o = 我是消费式函数接口
可以看出,传入了参数,没有返回值,故称为消费型
Supplier:无中生有
具体的使用方法如下:
public static void main(String[] args) {
Supplier<String> supplier = new Supplier<String>() {
@Override
public String get() {
return "我是一个私生子";
}
};
String s = supplier.get();
System.out.println("s = " + s);
}
//运行结果
s = 我是一个私生子
可以看出,没有传递任何参数,但是有返回值,无中生有产生了数据。
Predicate
Predicate里面给出的抽象方法有参数,返回值为boolean,就是对数据进行校验,具体使用方法如下:
public static void main(String[] args) {
Predicate<String> predicate = new Predicate<String>() {
@Override
public boolean test(String s) {
if("1".equals(s)){
return true;
}
return false;
}
};
boolean test = predicate.test("2");
System.out.println("test = " + test);
}
//运行结果
test = false
Function<T,R>
可以看出,在抽象方法中既有参数,也有返回值,用于对代码逻辑进行处理。具体示例如下:
public static void main(String[] args) {
Function<String, Object> function = new Function<String, Object>() {
@Override
public Object apply(String s) {
return "传给我的参数是:" + s;
}
};
Object tom = function.apply("Tom");
System.out.println(tom);
}
//运行结果
传给我的参数是:Tom
在上面的有参数的三种函数式接口,JDK也提供了给出两个参数的函数如:BiConsumer<T, U>,BiFunction<T, U, R> ,BiPredicate<T, U>。