常用的函数式接口:
java.util.function.Supplier接口中仅包含一个无参的方法:T get()。用来获取一个泛型参数指定类型的对象数据
Supplier接口被称为生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据
import java.util.function.Supplier;
public class Demo01Supplier {
public static String getString(Supplier<String> supplier) {
return supplier.get();
}
public static void main(String[] args) {
String s = getString(()->{
return "张三";
});
System.out.println(s);
}
}
练习:求数组元素的最大值
使用Supplier接口作为方法参数类型,通过Lambda表达式求出int数组中的最大值
提示:接口的泛型请使用Java.lang.Integer类
import java.util.function.Supplier;
public class Demo02Test {
public static int getMax(Supplier<Integer> sup){
return sup.get();
}
public static void main(String[] args) {
int[] arr = {12,41,42,64,673,632,55};
int value = getMax(()->{
int max = 0;
for (int i : arr) {
if (i > max) {
max = i;
}
}
return max;
});
System.out.println("最大值为" + value);
}
}
java. util. function. Consumer接口则正好与Suppl ier接口相反,
它是生产一个数据,而另一个消费一个数据,其数据类型由泛型决定。
Consumer接口中包含抽象方法void accept(T t), 意为消费- -个指定泛型的数据。
Consumer接口是一个消费型接口,泛型执行什么类型,就可以使用accept方法消费什么类型的数据
至于具体怎么消费(使用),需要自定义(输出,计算…)
import java.util.function.Consumer;
public class Demo03Consumer {
public static void method(String name, Consumer<String> con){
con.accept(name);
}
public static void main(String[] args) {
method("赵丽颖",(String name)->{
System.out.println(name);
//字符串反转输出
String reName = new StringBuffer(name).reverse().toString();
System.out.println(reName);
});
}
}
Consumer接口的默认方法andThen
作用:需要两个Consumer接口,可以把两个Consumer接口组合到- -起, 在对数据进行消费
例如:
Consumer con1
Consumer con2
String s = “hello”;
con1. accept(s); .
con2. accept(s);
连接两个Consumer接口再进行消费
con1. andThen(con2). accept(s);谁写前边谁先消费
public class Demo04AndThen {
public static void method(String s, Consumer<String> con1,Consumer<String> con2){
//con1.accept(s);
//con2.accept(s);
con1.andThen(con2).accept(s);
}
public static void main(String[] args) {
method("Hello",(t)->{
System.out.println(t.toUpperCase());
},(t)->{
System.out.println(t.toLowerCase());
});
}
}
练习:
字符串数组当中存有多条信息,请按照格式“姓名: XX。 性别: XX。 ”的格式将信息打印出来。
要求将打印姓名的动作作为第一个Consumer接口的Lambda实例,
将打印性别的动作作为第二个Consumer接口的Lambda实例,
将两个Consumer接口按照顺序拼接到一起。
import java.util.function.Consumer;
public class Demo05Test {
public static void printInfo(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 = {"迪丽热巴,女", "古力娜扎,女"};
printInfo(arr,(s)->{
String name = s.split(",")[0];
System.out.print("姓名" + name);
},(s)->{
String age = s.split(",")[1];
System.out.println("性别"+ age);
});
}
}