函数式接口:
由@FunctionalInterface注解,简称FI。
其中有且只有一个自己独有的抽象方法,不包括从上级继承过来的方法。
其中可以有多个默认方法和静态方法
例如:
@FunctionalInterface public interface FiTest{ String get(); default String toHello(String name){ return "hello " + name; } default String toBuy(String name){ return "buy " + name; } static String getName(){ return "FiTest"; } //默认从超类继承的方法 boolean equals(Object obj); }
Java中重要的四个函数式接口(Function,Consumer,Supplier,Predicate)
①Function接口:就是函数的意思,传入一个参数,返回一个值
//Function函数,传入一个参数,返回一个结果 //<>里面第一个是参数类型,第二个是返回的结果类型 Function<Integer,Integer> sum = s->s + 10; Function<Integer,Integer> mul = s->s*s; //apply就是那个抽象方法:将此函数应用于给定的参数。 Integer apply = sum.apply(123); System.out.println(apply);//结果:133 //compose:返回一个组合函数,先执行参数(mul也是一个function函数)的apply方法, //再执行方法调用者的apply方法 //--先执行mul的方法10*10=100,再执行sum的方法100+10=110 Integer apply1 = sum.compose(mul).apply(10); System.out.println(apply1);//结果:110 //andThen:返回一个组合函数,先执行方法调用者的apply方法,再执行参数的apply的方法 //--先执行sum的apply方法10+10=20,再执行mul的apply方法20*20=400 Integer apply2 = sum.andThen(mul).apply(10); System.out.println(apply2);//结果:400 //identity:返回一个函数,该函数总是返回其输入参数。 Function<Object, Object> identity = Function.identity(); Object apply3 = identity.apply("aaa"); System.out.println(apply3);//结果:aaa
②Predicate接口:谓语接口,传入一个参数,返回一个boolean类型的值。相当于中文的‘与’,‘且’,‘非’,‘是’
Predicate<Integer> predicate = s -> s > 10; //是 100大于10 boolean test = predicate.test(100); System.out.println("是:"+test); //非 10不大于10 Predicate<Integer> negate = predicate.negate(); boolean test1 = negate.test(10); System.out.println("非:"+test1); boolean test2 = negate.test(100); System.out.println("非:"+test2); Predicate<Integer> predicate2 = s -> s < 20; //与 大于10小于20以内的 boolean test3 = predicate.and(predicate2).test(15); System.out.println("与:"+test3); //或 大于10 或者小于0的 Predicate<Integer> predicate3 = s -> s < 0; boolean test4 = predicate.or(predicate3).test(200); boolean test5 = predicate.or(predicate3).test(-1); System.out.println("或:"+test4); System.out.println("或:"+test5); //结果: //是:true //非:true //非:false //与:true //或:true //或:true③ Consumer接口:消费者,就是传入参数,没有返回值,表示接受单个输入参数并返回无结果的操作
//表示接受单个输入参数并返回无结果的操作 Consumer<String> consumer = s->{ s = s + 1; System.out.println(s); }; //accept:在给定的参数上执行此操作 consumer.accept("aaa");//结果:aaa1 Consumer<String> consumer1 = s->{ s = s + 2; System.out.println(s); }; //andThen:返回一个组合的consumer函数,先执行调用者(consumer)的accept方法 //再执行参数的accept方法 consumer.andThen(consumer1).accept("abc"); //结果: //abc1 //abc2④ Supplier:提供者,不需要参数可以返回一个结果
//提供者,没有参数可以返回一个结果 Supplier<String> supplier = ()->{ String h = "hello "; h = h + "world"; return h; }; //获取结果 String s = supplier.get(); System.out.println(s);//结果:hello world