常见函数式接口
JDK提供了大量常用的函数式接口以丰富Lambda的经典使用常见 它们注意在java.util.function包中被提供
Consumer接口
Consumer<T>接口则正好与Supplier接口相反 它不是生成一个数据 而是消费一个数据 其数据类型由泛型决定
抽象方法:accept
Consumer接口中包含抽象方法void accept(T t),意为消费一个指定泛型的数据
代码:
public class BConsumer { public static void consumeString(String name,Consumer<String> con){ con.accept(name); } public static void main(String[] args) { //调用consumeString方法,传递字符串姓名,方法的另一个参数是Consumer接口,是一个函数式接口,所以可以传递Lambda表达式 consumeString("赵丽颖", (String name)->{ /* 对传递的字符串进行消费 消费方式:直接输出字符串 */ // System.out.println(name); //消费方式:把字符串进行反转输出 String s = new StringBuffer(name).reverse().toString(); System.out.println(s); }); } }
默认方法:andThen
如果一个方法的参数和返回值全都是Consumer类型 那么可以实现效果 消费数据的时候 首先做一个操作 然后再做一个操作 实现组合 而这个方法就是Consumer接口中的default方法andThem
作用:需要两个Consumer接口 可以把两个ConSumer接口组合到一起 在对数据进行消费
例如:
consumer<String> con1
consumer<String> con2
String s="hello"
con1.accept(s);
con2.accept(s);
连接两个Consumer接口 再进行消费
con1.andThen(con2).accept(s);谁写前边谁先消费
代码:
public class BAndThen { //定义一个方法,方法的参数传递一个字符串和两个Consumer接口,Consumer接口的泛型使用字符串 public static void method(String s, Consumer<String> con1,Consumer<String> con2){ con1.accept(s); con2.accept(s); System.out.println("---------------"); //使用andThen方法,把两个Consumer接口连接到一起,在消费数据 con1.andThen(con2).accept(s);//con1连接con2,先执行con1消费数据,在执行con2消费数据 } public static void main(String[] args) { //调用method方法,传递一个字符串,两个Lamdba表达式 method("Hello", (t)->{ //消费方式:把字符串转换为大写输出 System.out.println(t.toUpperCase()); }, (t)->{ //消费方式:把字符串转换为小写输出 System.out.println(t.toLowerCase()); }); } }
运行结果:
练习:格式打印信息
题目:
下面的字符串数组当中存有多条信息 请按照格式“姓名:xx。性别:xx”的格式将信息打印出来 要求将打印姓名的动作作为第一个Consumer接口的Lambda实例 将打印性别的动作作为第二个Consumer接口的Lambda实例 将两个Consumer接口拼接到一起
代码:
public class BConsumer2 { //定义一个方法,参数传递String类型的数组和两个Consumer接口,泛型使用String public static void pringInfo(String[] arr, Consumer<String> con1,Consumer<String> con2){ //遍历字符串数组 for (String s : arr) { con1.andThen(con2).accept(s); } } public static void main(String[] args) { //定义一个字符串类型的数组 String[] arr = {"迪丽热巴,女","古力娜扎,女","马尔扎哈,男"}; //调用pringInfo方法,传递一个字符串数组,和两个Lambda表达式 pringInfo(arr,s -> { //消费方式:对s进行切割,获取姓名,按照指定的格式输出 String name = s.split(",")[0]; System.out.print("姓名:"+name); }, s -> { //消费方式:对s进行切割,获取年龄,按照指定的格式输出 String age = s.split(",")[1]; System.out.print(",年龄:"+age+","); }); } }
运行结果:
public class BAndThen {标签:con1,con2,函数,接口,accept,Consumer,String From: https://www.cnblogs.com/qihaokuan/p/16610283.html
//定义一个方法,方法的参数传递一个字符串和两个Consumer接口,Consumer接口的泛型使用字符串
public static void method(String s, Consumer<String> con1,Consumer<String> con2){
con1.accept(s);
con2.accept(s);
System.out.println("---------------");
//使用andThen方法,把两个Consumer接口连接到一起,在消费数据
con1.andThen(con2).accept(s);//con1连接con2,先执行con1消费数据,在执行con2消费数据
}
public static void main(String[] args) {
//调用method方法,传递一个字符串,两个Lamdba表达式
method("Hello",
(t)->{
//消费方式:把字符串转换为大写输出
System.out.println(t.toUpperCase());
},
(t)->{
//消费方式:把字符串转换为小写输出
System.out.println(t.toLowerCase());
});
}
}