一,函数式接口
有且仅有一个抽象方法的接口
Java中函数式编程的体现就是Lambda表达式,函数式接口就是适用于Lambda表达式的接口
只有确保接口中有且仅有一个抽象方法,java中的Lambda才能顺利的进行推导
@FunctionalInterface函数式接口的注解,与前面的@Override一样,当检测到与注解不同时就不会通过编译
当然,如果已经确信自己的是正确的它是可以省略的
函数式接口可以作为方法的参数也可以作为方法的返回值
函数式接口作为方法的参数:用到的方法useRunnable(Runnable r)
useRunnable(()-> System.out.println("线程已启动"+Thread.currentThread().getName()));
函数式接口作为方法的返回值:
Collections.sort(list,useComparable()); private static ComparatoruseComparable(){ return (s1,s2)->s1.length()-s2.length(); }
二,常用函数式接口
1、Supplier接口
Supplier
包含一个无参的方法get()
String s=useSupplier(()-> "落霞与孤鹜齐飞,秋水共长天一色。"); System.out.println(s); private static String useSupplier(Suppliersup){ return sup.get(); }
2、Consumer接口
void accept(T t):对给定的参数执行此操作
default Consumer
Consumer
public class Test4 {
public static void main(String[] args) {
useConsumer("落霞与孤鹜齐飞,秋水共长天一色。",s-> System.out.println(s));
useConsumer("落霞与孤鹜齐飞,秋水共长天一色。",s -> System.out.println(s.substring(0,s.length()/2)),s -> System.out.println(s.substring(s.length()/2)));
}
private static void useConsumer(String s,Consumer con1,Consumer con2){
con1.andThen(con2).accept(s);
}
private static void useConsumer(String s, Consumer con){
con.accept(s);
}
}
3、Predicate接口
此接口通常用来判断参数是否满足指定的条件
boolean test(T t): 对给定的参数进行判断(判嘶逻辑由Lambda表达式实现),返回一个布尔值
default Predicate
default Predicate
defaultPredicate
public class Test5 {
public static void main(String[] args) {
boolean b1=usePredicate("helloworld",s->s.length()>8);
System.out.println(b1);
boolean b2=usePredicate("hello",s->s.length()>8,s -> s.length()<15);
System.out.println(b2);
}
private static boolean usePredicate(String s, Predicate pre1,Predicate pre2){
// 短路与,前为false后为true,结果为false
// return pre1.and(pre2).test(s);
// 短路或,前为false后为true,结果为true
return pre1.or(pre2).test(s);
}
private static boolean usePredicate(String s, Predicate pre){
// return pre.test(s);结果为true
return pre.negate().test(s);
}
}
Function接口
此接口通常用于对参数进行处理,转换(由Lambda表达式完成),然后返回新的值
Function
R apply(T t):将此函数应用于给定的参数
default
import java.util.function.Function;
public class Test6 {
public static void main(String[] args) {
String str="小明,18";
useFunction(str,s-> String.valueOf(s.split(",")[1]),s->Integer.parseInt(s)+70);
}
private static void useFunction(String s, Function fun1,Function fun2){
System.out.println(fun1.andThen(fun2).apply(s));
}
}
Consumer的andThen()第一个操作完,然后第二个操作,但是两次互不影响,Function的andThen()则是第二个在第一个操作结果上操作。



