函数式接口
什么是函数式(Functional)
- 只包含一个抽象方法的接口,称为函数式接口
- 你可以通过lambda 表达式来创建该接口对象。(若lambda表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行生命)
- 我们可以在一个接口上使用@FunctionalInterface 注解,这样做可以检查他是否是一个函数式接口,同时javadoc也会包含一条生命,说明这个接口是一个函数式接口
- 在java,util.function包下定义了java8的丰富函数式接口
如何理解函数式接口
- java为了应对市面上更多语言的挑战与更广泛的技术要求,所以java 不但要支持oop还要支持oof(面对函数编程)。Spring也对此作出了响应调整
- lambda表达式就是一个函数式接口的实例。
- 所有匿名实现类标识的现在都可以用lambda来实现
java内置四大核心函数式接口
函数式接口 | 参数类型 | 返回类型 | 用途 |
---|
Consumer< T>消费类型接口 | T | void | 对类型为T的对象应用操作,包含方法:void accept(T t) |
Supplier< T> 供给型接口 | 无 | T | 返回类型为T的对象,包含方法:T get() |
Function< T,R > 函数式接口 | T | R | 对类型为T的对象应用操作,并返回结果。结果是R类型的对象,包含方法:R apply(T t) |
Predicate< T> 断定类接口 | T | boolean | 确定类型为T的对象是否满足某约束,并发挥Boolean值,包含方法:boolean test(T t) |
举例
public class lambda2 {
@Test
public void test1(){
happytime(500, new Consumer<Double>() {
@Override
public void accept(Double aDouble) {
System.out.println("好好学习,天天向上.学费:" +aDouble);
}
});
happytime(500,moeny-> System.out.println("好好学习,天天向上。学费:" +moeny));
}
public void happytime(double moeny,Consumer<Double> consumer){
consumer.accept(moeny);
}
@Test
public void test2(){
List<String> list= Arrays.asList("北京","上海","广州");
ArrayList arrlist = filterString(list, new Predicate<String>() {
@Override
public boolean test(String s) {
return s.contains("广州");
}
});
System.out.println(arrlist);
ArrayList arrlist1 = filterString(list,s->s.contains("北京"));
System.out.println(arrlist1);
}
public ArrayList filterString(List<String> list, Predicate<String> pre){
ArrayList<String> filterList=new ArrayList<>();
for (String s:list) {
if (pre.test(s)){
filterList.add(s);
}
}
return filterList;
}
}