Supplier函数式接口
java.util.function.Supplier接口包含一个无参的方法,T get()。
-
用来获取一个泛型参数指定类型的对象数据。
-
Supplier接口被称之为生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就会产生什么类型的数据。
import java.util.function.Supplier;
public class DemoSupplier {
//定义一个方法返回值类型为String,参数为Supplier函数式接口
public static String getString(Supplier sup)
{
//调用get方法,获取String类型数据
return sup.get();
}
public static void main(String[] args) {
//匿名内部
String s1=getString(new Supplier() {
@Override
public String get() {
return “胡歌”;
}
});
//Lambda优化
String s=getString(()->“胡歌”);
System.out.println(s);
System.out.println(s1);
}
}
练习:求int数组的最大值
public class DemoSupplier {
public static int getMax(Supplier<Integer> sup)
{
return sup.get();
}
public static void main(String[] args) {
int [] arr={1,9,6,24,7,4,12,};
int max1=getMax(()-> {
int max=arr[0];
for (int i = 1; i < arr.length; i++) {
if(max<arr[i])
{
max=arr[i];
}
}
return max;
});
System.out.println(max1);
}
}
Consumer函数式接口
Consumer用于消费数据,其数据类型有泛型决定。
抽象方法accetp
import java.util.function.Consumer;
public class DemoConsumer {
//定义一个方法,参数为Consumer,消费String类型的数据
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 reanme=new StringBuffer(name).reverse().toString();
System.out.println(reanme);
});
}
默认方法andThen
作用:需要两个Consumer接口,可以吧两个Consumer接口组到一起,在对数据进行消费。
import java.util.function.Consumer;
public class DemoConsumer {
public static void method1(String s,Consumer<String> one,Consumer<String> two){
one.andThen(two).accept(s);
}
public static void main(String[] args) {
method1("Hello",
//把字符串内容转换为大写
(t)-> System.out.println(t.toUpperCase()),
//把字符串内容转为小写
(t)-> System.out.println(t.toLowerCase()));
}
练习:
字符串数组中存有多条信息,按指定格式:姓名: xx 年龄: xx的格式打印出来。
import java.util.function.Consumer;
public class DemoConsumer {
public static void method2(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={"胡歌,18","王凯,20","华晨宇,18"};
method2(arr,(s)->{
String s1 = s.split(",")[0];
System.out.print("姓名:"+s1+" ");
},(s)->{
String s2 = s.split(",")[1];
System.out.print("年龄:"+s2+" ");
});
}
}
Predicate接口
有时候需要对某种数据进行判断,从而得到booolean值的结果,我们就可以使用Predicate接口。
test方法
对元素进行判断。
and方法
连接两个判断条件 等同于&&
or方法
连接两个判断条件 等同于||
import java.util.function.Predicate;
public class DemoPredicate {
public static boolean bool(String s, Predicate<String> predicate) {
return predicate.test(s);
}
public static boolean boo12(String s, Predicate<String> pre1, Predicate<String> pre2) {
return pre1.and(pre2).test(s);
}
public static boolean bool3(String s2,Predicate<String> pre1,Predicate<String> pre2)
{
return pre1.or(pre2).test(s2);
}
public static void main(String[] args) {
boolean b = bool("name", (String str) ->
{
return str.length()>3;
});
System.out.println(b);
System.out.println("===========");
String s = "dscshjkd";
boolean a = boo12(s, (String s1) -> {
return s1.length() > 5;
}, (String s2) -> {
return s2.contains("a");
});
System.out.println(a);
System.out.println("===========");
boolean b3 =bool3(s,(String s1)->{
return s1.length()>5;
},
(String s2)->{
return s2.contains("a");
});
System.out.println(b3);
System.out.println("===========");
}
}
Function接口
apply<T,R>方法把T类型的数据转换为R类型的数据。
and方法 用来组合操作
import java.util.function.Function;
public class DemoFunction {
public static void method(String s, Function<String,Integer> function){
Integer apply = function.apply(s);
System.out.println(apply);
}
public static void method1(String s,Function<String,Integer> function1,Function<Integer,String> function2){
String s1 = function1.andThen(function2).apply(s);
System.out.println(s1);
}
public static void main(String[] args) {
/* String s = "1024";
method(s, (String s1) -> {
//把字符串类型的整数转换为Integer类型的整数
return Integer.parseInt(s1);
});
String s1="5201314";
method1(s1,(String s2)->{
return Integer.parseInt(s2)+10;
},(Integer in1)->{
return in1+"";
});
}
}