常用函数式接口_Consumer
Java8在java.util.function包下预定义了大量的函数式接口供我们使用
我们重点来学习下面的4个接口:
1、Supplier接口
2、Consumer接口
3、Predicate接口
4、Function接口
Consumer接口在java.util.function包下。该接口有一个泛型,即我们看到的
该接口有两个方法如下
方法 | 作用 |
---|---|
accept(T t) | 参数是泛型指定的数据,对给定的参数执行此操作 无返回值 |
andThen(Consumer<? super T> after) | 返回一个组合的Consumer,它按顺序执行此操作,然后执行after操作 返回值的是default Consumer |
get方法不需要参数,get方法会按照某种实现逻辑(由Lambda表达式实现)返回一个数据
常用函数式接口_Consumer的练习
xxxxxxxxxx
package ch25;
import java.util.function.Consumer;
public class a_6_1测试 {
public static void main(String[] args) {
//使用Lambda表达式调用下面写好的operatorString方法
operatorString("张三",(String s)->{//第一个参数是字符串,第二个参数是函数式接口Consumer
//第二个参数用Lambda表达式来代替
System.out.println(s);
});
//上面的Lambda表达式可以使用省略模式来优化一下
operatorString("张三2",s2->System.out.println(s2));
System.out.println("-----------");
//使用方法引用来调用下面写好的operatorString方法,方法引用在前面已经学过,可前去复习哦
//第二个参数用方法引用来代替
operatorString("张三2",System.out::println);
//这里的方法引用只是顺带提一下,我们重点要放在上面的Lambda表达式
System.out.println("-----------");
//上面的代码演示是直接在控制台输出
//-----------------------------------------------------------------------------------------------
//下面的代码演示是对字符串进行操作之后,比如翻转,再在控制台输出
operatorString("李四3",s3->{
String value = new StringBuilder(s3).reverse().toString();//把字符串翻转reverse,再转成字符串toString
System.out.println(value);
});
//上面的Lambda表达式可以使用省略模式来优化一下,如下
operatorString("李四4",s4->System.out.println(new StringBuilder(s4).reverse().toString()));
System.out.println("-------------------------");
//-------------------------------------------------------------------------------------------------
//思考:上面那些方法都是把一个字符串消费一次,如何把一个字符串消费两次呢
//解决:在最下面的operatorString2方法里面传两个Consumer接口参数,注意共3个参数,因为还要一个字符串参数
operatorString2("我是字符串",s5->System.out.println(s5),s5->System.out.println(new StringBuilder(s5).reverse().toString()));
//思考:Consumer接口里面的andThen方法也可以达到上面那行的效果,如下
operatorString3("我是字符串2",s6->System.out.println(s6),s6->System.out.println(new StringBuilder(s6).reverse().toString()));
}
//----------------------------------------------------------------------------------------------------------
//定义一个方法,消费一个字符串数据。参数只有一个是Consumer接口
private static void operatorString(String name, Consumer<String> con){//第一个参数是字符串,第二个参数是函数式接口Consumer
con.accept(name);
}
//定义一个方法,用不同的方式来消费同一个字符串数据两次。参数有两个Consumer接口
private static void operatorString2(String name, Consumer<String> con1, Consumer<String> con2){
con1.accept(name);
con2.accept(name);
//上面需要两行方法体才能完成操作,我们在下面的operatorString3方法中将用一行方法体完成相同的操作
}
//定义一个方法,用不同的方式来消费同一个字符串数据两次。参数有两个Consumer接口
private static void operatorString3(String name,Consumer<String> con1,Consumer<String> con2){
con1.andThen(con2).accept(name);//先通过con1接口对name进行accept消费,再通过con2接口对name进行accept消费
}
}
Consumer接口练习_打印信息
练习: 1、String[] strArray={"张三,18","李四,19","王五,20"}; 2、字符串数组中有多条信息,请按照格式: "姓名:XX。年龄:XX"的格式将信息打印出来 难点:姓名和年龄数据在同一个字符串数组里面。我们要使用逗号将这两个数据分割出来
要求: 1、把打印姓名的动作作为第一个Consumer接口的Lambda实例 2、把打印年龄的动作作为第二个Consumer接口的Lambda实例 3、将两个Consumer接口按照顺序组合到一起使用
Consumer接口练习_打印信息的练习
xxxxxxxxxx
package ch25;
import java.util.function.Consumer;
public class a_7_1测试 {
public static void main(String[] args) {
String[] strArray = {"张三,18", "李四,19", "王五,20"};//数组里面有三个字符串
//姓名的printInfo方法有三个参数,第一个参数是字符串数组,第二个和第三个参数是函数式接口Consumer。注意使用的是Lambda表达式作为第二个和第三个参数
printInfo(strArray, (String str) -> {
String name = str.split(",")[0];//把其中的字符串使用逗号分割,拿的是分割后的第一个数据
System.out.print("姓名:" + name);//这行使用的是print输出,即不换行
}, (String str) -> {
int age = Integer.parseInt(str.split(",")[1]);//把其中的字符串使用逗号分割,拿的是分割后的第一个数据
//上面那行的str.split(",")[1]是字符串数据,我们需要转换成整型
System.out.println("。年龄:" + age);
});
System.out.println("-------------------");
//上面的Lambda表达式可以优化一下,即使用省略模式,如下
String[] strArray2 = {"张三,18", "李四,19", "王五,20"};
printInfo(strArray2, str -> System.out.print("姓名:" + str.split(",")[0]),
str -> System.out.println("。年龄:" + Integer.parseInt(str.split(",")[1])));
}
private static void printInfo(String[] strArray, Consumer<String> con1, Consumer<String> con2) {
//增强for遍历数组
for (String str : strArray) {
con1.andThen(con2).accept(str);
}
}
}