虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的抽象方法,不是规定接口中只能有一个方法,称为函数式接口
函数式接口:只能有一个抽象方法,其他的可以有default、static、Object里public方法等。作用:在Java中主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。
JDK8专门提供了@FunctionalInterface注解,用来进行编译检查。 已经使用过的函数式接口,比如Comparator等,后面在多线程阶段要学习的函数式接口有Runnable、Callable等。(注意:Comparable并没有被标记为函数式接口)
当一个接口中有两个方法,那么注解@FunctionalInterface将会报错,它主要功能就是检测这个接口是否为函数式接口
函数式接口:分类
1)消费型接口Consumer
断言型接口Predicate
public class TestFunctional2 {
public static void main(String[] args) {
List<Integer > list = new ArrayList<>();
Collections.addAll(list,34,56,89,65,87);
System.out.println(list);
Predicate predicate = new Predicate<Integer>(){
@Override
public boolean test(Integer i) {
if(i<60){
return true;
}
return false;
}
};
list.removeIf(predicate);
System.out.println(list);
list.removeIf((i)->{if(i>80) {
return true;
}
return false;
});
System.out.println(list);
}
}
断言型接口2
public class TestFunctional3 {
public static void main(String[] args) {
List<String > list = new ArrayList<>();
Collections.addAll(list,"Java","MySQL","HTML","JSP","SSM");
System.out.println(list);
int length=4;
Predicate <String>predicate =
(elem)->{if(elem.length()>=length ) return true; return false;};
List<String> list2 = retailIf(predicate,list);
System.out.println(list2);
}
public static List retailIf(Predicate predicate,List<String> list){
List<String> list2 = new ArrayList<>();
for (String elem :list){
if(predicate.test(elem)){
list2.add(elem);
}
}
return list2;
}
}
方法的引用就是让Lambda表达式更加 简单
|