Java 基础复习 Day 25
常见函数式接口(2)
JDK自带的函数式接口一般放在java.util.function 包下
本次主要学习function包下的Supplier,Consumer,Predicate,Function接口
-
Supplier接口 Interface Supplier
接口抽象方法:T get()
-
用来获取一个泛型参数指定类型的对象数据。意味着Lambda表达式需要向外提供一个符合泛型类型的对象数据类型
-
生产型接口:泛型指定啥类型,就生产什么类型的数据
//生产String类型的数据 public class DemoSupplier { //定义一个方法,方法的参数传递Supplier接口,指定泛型为String public static String makeString(Supplier<String> supplier){ return supplier.get(); } public static void main(String[] args) { //main方法调用makeString,可用Lambda表达式 String result = makeString(() -> { //生产一个字符串并返回 return "Karen is made"; }); System.out.println(result); } }
-
-
Consumer接口 Interface Consumer
-
接口抽象方法是:void accept(T t)
正好和Supplier接口的get方法相反,Consumer用来使用或者消费指定泛型的数据
//定义一个方法,参数是一个字符串和Consumer接口 public static void showName(String lastN, Consumer<String> consumer){ consumer.accept(lastN);//没有返回值 } public static void main(String[] args) { //最简单消费方式:输出 showName("Kou",(name) -> System.out.println("Karen" + name)); //字符串反转输出 showName("KarenKou",(name) -> { StringBuilder build = new StringBuilder(name); build.reverse(); System.out.println(build); }); }
-
接口的默认方法 andThen
default Consumer
andThen(Consumer<? super T> after)
返回一个组合的Consumer
,按顺序执行该操作,然后执行after
操作。JDK 源码
default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; }
-
-
返回一个组合的
Consumer
,Consumer
执行该操作,后跟after
操作。 如果执行任一操作会抛出异常,它将被转发到组合操作的调用者。 如果执行此操作抛出一个异常,after
操作将不被执行。-
参数
after
- 此操作后执行的操作 -
结果
一个组合的
Consumer
按顺序执行该操作,后跟after
操作 -
异常
NullPointerException
- ifafter
is null -
作用:需要两个Consumer接口,可以把两个Consumer接口组合在一起,在对数据进行消费
-
例子:Consumer con1;
Consumer con2;
String s = “Hello”
con1.accept(s);
con2.accept(s);
等价于:con1.andThen(con2).accept(s)//写在前面的先消费,就是先消费con1再消费con2
public class DemoAndThen { //定义一个方法,参数传递一个字符串,和两个Consumer接口 public static void consumeStrings(String str, Consumer<String> con1,Consumer<String> con2){ con1.andThen(con2).accept(str); } public static void main(String[] args) { consumeStrings("Hello World",(str1)-> System.out.println(str1.toLowerCase()),(str2)-> System.out.println( str2.toUpperCase())); } }
-
-
Predicate接口 Interface Predicate
有时候需要对某种数据类型的数据进行判断,从而得到一个boolean值,此时可以用Predicate接口
Predicate中的抽象方法
boolean test(T t)
对某种数据类型的数据进行判断 ,符合返回true,不符合返回false
public class DemoPredicate { //定义一个方法,参数传递一个String类型的字符串 //传递一个Predicate接口,泛型使用String //使用test()对字符串进行判断并返回判断结果 public static boolean checkString(String str, Predicate<String> predicate){ return predicate.test(str); } public static void main(String[] args) { boolean flag = checkString("KarenKou is cool", (str) -> str.contains("K")); System.out.println(flag); } }
-
Predicate中的or,negate,and方法
相当于对两个指定数据类型的数据进行 &&,||,!操作
-
and
public static boolean checkStrings(String str, Predicate<String> pred1, Predicate<String> pred2){ // return pred1.test(str) && pred2.test(str); and方法就等价于两个pred接口的test结果做且运算 return pred1.and(pred2).test(str); } public static void main(String[] args) { boolean result = checkStrings("SDFEFED", (str) -> str.contains("T"), (str) -> str.length() == 5); System.out.println(result);//false }
-
or
public class DemoPreidicate_or { public static boolean checkStrings(String str, Predicate<String> pred1, Predicate<String> pred2){ // return pred1.test(str) || pred2.test(str); or方法就等价于两个pred接口的test结果做或运算 return pred1.or(pred2).test(str); } public static void main(String[] args) { boolean result = checkStrings("SDFEFED", (str) -> str.contains("E"), (str) -> str.length() == 5); System.out.println(result);//true } }
-
negate
public class DemoPredicate_negate { public static boolean checkStrings(String str, Predicate<String> pred){ //return !pred.test(str); negate就是相对于pred的结果做取反 return pred.negate().test(str); } public static void main(String[] args) { boolean result = checkStrings("SDFEFED", (str) -> str.length() > 5); System.out.println(result);//false } }
-
-
Function接口Interface Function<T,R>
Function接口用来根据一个类型的数据得到另外一个数据的类型,T称为前置条件,R称为后置条件
Function中最主要的方法时apply:根据类型T的参数获取类型为R的结果
使用场景:将String转为Integer类型
public class DemoFunction { //定义一个方法,参数传递一个String类型 //参数传递一个Function接口 public static void changeString(String str, Function<String,Integer> fun){ Integer afterResult = fun.apply(str); System.out.println(afterResult); } public static void main(String[] args) { changeString("45",(str) -> Integer.parseInt(str));//45 } }
-
Function中的默认方法andThen,和Consumer中的一样用来组合操作
进行两次数据类型的转换组合
String str ⇒ Integer a +10 ⇒ String
public class DemoFunctionAndThen { public static void changeStrings(String str, Function<String,Integer> fun1, Function<Integer,String> fun2){ String apply = fun1.andThen(fun2).apply(str); System.out.println(apply); } public static void main(String[] args) { changeStrings("234",(str)-> Integer.parseInt(str)+10,(str)->str +"" );//244 } }