函数式接口
函数式接口
在jdk8中什么是函数式接口:
1、被@FunctionalInterface注解修饰的。
2、接口里边只有一个非default的方法。
满足以上2个条件的即为函数式接口,ps:即使一个接口没有被@FunctionalInterface修饰,但是满足2,那么这样的接口也会是函数式接口。
函数式接口,对于Java来说就是接口内只有一个公开方法的接口,因为使用lanbda表达式,例如() -> user.getName()对应的调用则可能是func.get(),编译器会根据接口推断所属于的方法,如果有两个则无法推断.Java8提供了很多函数式接口,一般都使用注解@FunctionalInterface声明,有必要了解如下一些函数式接口.
函数式接口 | 输入参数 | 返回值 | 描述 |
---|---|---|---|
Supplier | 无 | T | 接收一个T类型的值 |
Consumer | T | 无 | 输入一个T类型的参数,没有返回值 |
BiConsumer | T,R | 无 | 输入两个T,R类型的参数,没有返回值 |
Predicate | T | Boolean | 输入一个参数,返回一个boolean值 stream的filter就接受的这个行为 |
ToIntFunction | T | Integer | 输入T类型的参数 返回一个Integer的值 |
ToLongFunction | T | Long | 输入T类型的参数 返回一个Long的值 |
ToDoubleFunction | T | double | 处理T类型的值,并返回double值 |
Function | T | R | 处理T类型的值,并返回R类型值 |
BiFunction | T,U | R | 处理T类型和U类型的值,并返回R类型值 |
BinaryOperator | T,T | T | 处理T类型值,并返回T类型值 |
UnaryOperator | T | T | 处理T类型值,并返回T类型值, |
… | … | … | … |
还有很多的函数式的接口,都在java.util.function这个包下。
举例:
Function、Predicate、Consumer、Supplier接口
这些接口都有一个@FunctionalInterface注解,表明这个接口将是一个函数式接口,里面只能有一个抽象方法
package com.unisound.dcs.project.async;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
/**
* @author: fanjiuhui
* @Date: 2019/8/8
* @Description:
*/
public class Test {
public static void main(String[] args) {
// 这些接口都有一个@FunctionalInterface注解,表明这个接口将是一个函数式接口,里面只能有一个抽象方法
// Function 接受一个输入参数,返回一个结果
Function<Integer,String> function = (x) -> "result"+x;
String apply = function.apply(1);
System.out.println(apply);
// Predicate 接受一个输入参数,返回布尔值
Predicate<Integer> predicate = (x) -> 1 == x;
boolean test = predicate.test(1);
System.out.println(test);
// Consumer 接受一个输入参数,无返回值
Consumer<String> consumer = (str) -> System.out.println("str is " +str);
consumer.accept("123");
// Supplier 无输入参数,返回一个结果
Supplier<String> supplier = () -> "supplier";
String s = supplier.get();
System.out.println(s);
}
}
====================输出结果===============================================================
result1
true
str is 123
supplier
Process finished with exit code 0