函数式接口
概述
-
含义:
- 只有一个抽象方法的接口,这个接口就是函数式接口
- 函数式接口是Lambda表达式的适用前提
-
格式说明:
- 检查一个接口是否是函数式接口,可以使用一个注解
- @functionalInterface
- 效果:
- 如果不是函数式接口则编译报错
- 检查一个接口是否是函数式接口,可以使用一个注解
函数式接口的理解和作用
-
函数:
- 处理数据的逻辑,定义参数和处理参数的代码,可能能返回处理的结果
- 单独存在的一个处理逻辑,不应该从属于热别的主体(不应该属于某个类、不应该属于某个对象)
- 定义的角度来说,医改定义在文件中,而非某个类或者接口中
- java语言只有方法没有函数
- 弊端:只传递原始数据或者结果数据,无法传递对于数据的处理方式;没有所谓的函数的类型,无法声明函数的引用
-
java的解决方案:
- 使用函数式接口来解决
- 具体:
- 使用几个接口讲方法包起来,认为包起来的方法就是一个函数,借口就是函数的类型,有了这个类型之后就可以声明该类型含税引用
- 使用接口的实现类对象,来表达函数的具体内容认为成函数类型的对象
- 这种结局方案称为函数式编程
jdk中提供的常用函数式接口
- 原因:
- 每次想表达函数是,自己定义一个接口,用来表达函数的类型等,太麻烦
- 而且很多函数都是同一类型,且经常使用,不希望每次都要自己定义
- jdk就将这些常用的函数类型,帮我们定义出来了
罗列
- Consumer : 消费接口
- void accept(T t)
- Supplier: 供给形接口
- T get()
- Function<T,R>: 函数型接口
- R apply(T t)
- Predicate : 断言型接口
- boolean tst(T t)
消费型接口
- Consumer : 消费接口
- void accept(T t)
- 其中T表示该函数要消费的内容
- 消费:获得这个内容使用,之后就没有这个数据了
方法引用
供给型接口
public static void main(String[] args) {
// () ->new Random().nextInt(100) + 1) 相当于重写了Supplier的get方法,
//方法内容是返回new Random().nextInt(100) + 1的值
List<Integer> list = creatList(10, () -> new Random().nextInt(100) + 1);
System.out.println(list);
}
public static List<Integer> creatList(int n,Supplier<Integer> sup){
List<Integer> list = new ArrayList<Integer>();
while(list.size() < n) {
list.add(sup.get());
}
return list;
}
函数型接口
断言型接口
- Predicate : 断言型接口
- boolean tst(T t)