概念:函数式接口在Java中是指有且仅有一个抽象方法的接口(当然可以包含其他方法:静态、默认、私有方法)
Java中函数式接口的体现就是lamada表达式
@FunctionalInterface(注解)
作用:检测接口是否是函数式接口
函数式接口的使用:一般作为方法的参数和返回值使用
例:
作为参数:show(()->System.out.println("函数式接口的第一次使用"));
作为返回值:
public static Comparator<String> getComparable(){
return (o1,o2)->o1.length()-o2.length();
}
lambda表达式编译后不会生成.class文件(效率高于匿名内部类)
而匿名内部类会生成.class文件(Demo$1.class)
lambda的特点:延迟加载
常用函数式接口:
1.Suppllier接口:生产型接口,指定接口泛型的类型,get()方法就会生产(返回)什么类型的数据,get方法具有返回值
例:
public class Demo {
public static int getMax(Supplier<Integer> sup){
return sup.get();
}
public static void main(String[] args) {
int[] arr = {1,665,885,565,36,889,100};
int result = getMax(() -> {
int max = arr[0];
for (int i : arr) {
if (max < i){
max = i;
}
}
return max;
});
System.out.println(result);
}
}
2.Consumer接口:消费型接口,指定接口泛型的类型,accept(T t)方法就会消费(使用)什么类型的数据,至于怎么消费(使用)则需自定义,accep方法无返回值
例:
public class Demo {
public static void print(String str,Consumer<String> consumer){
consumer.accept(str);
}
public static void main(String[] args) {
String name = "niefengqi";
print(name,(str)->{
//消费方式:直接输出
System.out.println(str);
//消费方式:反转输出
StringBuilder builder = new StringBuilder(name);
System.out.println(builder.reverse().toString());
});
}
}
Consumer接口的默认方法andThen()
作用:需要两个Consumer接口,可以把两个Consumer接口组合在一起,再对数据进行消费
例:
public class Demo {
public static void method(String s, Consumer<String> con1,Consumer<String> con2){
// con1.accept(s);
// con2.accept(s);
//上面两行代码相当于调用andThen方法
con1.andThen(con2).accept(s);
}
public static void main(String[] args) {
method("Hello",
(s)->{
System.out.println(s.toLowerCase());
},
(s)->{
System.out.println(s.toUpperCase());
});
}
}
3.predicate接口:对某种数据类型进行判断(调用test(T t)抽象方法),结果返回一个boolean值
例:
public class Demo09 {
public static boolean checkString(String s, Predicate<String> pre){
return pre.test(s);
}
public static void main(String[] args){
//判断字符串是否以字母n开始
boolean b = checkString("niefengqi", (s) ->s.charAt(0) == 'n' || s.charAt(0) == 'N');
System.out.println(b);
}
}
predicate接口的默认方法and(),表示并且关系,也可以用于连接两个判断条件
相当于逻辑与&&
pre1.and(pre2).test(t);
predicate接口的默认方法or(),表示并且关系,也可以用于连接两个判断条件
相当于逻辑或||
pre1.or(pre2).test(t);
4.Function<T,R>接口:用于根据一个类型的数据得到另一个类型的数据
抽象方法: R apply(T t) 根据参数t的类型得到类型R的返回值
默认方法: andThen() 用于进行组合操作,该方法同样用于先做什么再做什么的场景,和Consum中地andThen差不多。
格式: fun1.andThen(fun2).apply(t);