常用函数式接口_Function
Java8在java.util.function包下预定义了大量的函数式接口供我们使用
我们重点来学习下面的4个接口:
1、Supplier接口
2、Consumer接口
3、Predicate接口
4、Function接口
Function接口在java.util.function包下。该接口有一个@FunctionalInterface注解,说明是函数式接口 该接口有两个泛型,即我们看到的<T,R>。其中T是函数输入的类型,R是函数结果的类型 该接口表示接收一个参数并产生结果的函数,即根据T参数得到R结果
该接口有四个方法andThen、apply、compose、identity如下,我们只学习其中的andThen、apply方法
1、返回首先将此函数应用于其输入的after函数,然后将after函数应用于结果
default <V> Function<T,V> andThen(Function<? super R,? extends V> after)
2、将此函数应用于给定的参数
xxxxxxxxxx
R apply(T t)
3、返回一个组合函数,该函数首先将before函数应用于其输入,然后将此函数应用于结果
xxxxxxxxxx
default <V> Function<V,R> compose(Function<? super V,? extends T> before)
4、返回一个始终返回其输入参数的函数
xxxxxxxxxx
static <T> Function<T,T> identity()
总结:Function接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值
常用函数式接口_Function的练习
xxxxxxxxxx
package ch25;
import java.util.function.Function;
public class a_11_1测试 {
public static void main(String[] args) {
convert("100",(String s)->{
return Integer.parseInt(s);
});
//使用省略模式优化一下上面的Lambda表达式,如下
convert("100",s->Integer.parseInt(s));//我们一这行的Lambda表达式为主,上面那个Lambda和下面那个方法引用只是顺带提一下
//其实还可以使用方法引用继续优化,如下
convert("100",Integer::parseInt);//把参数s传给了静态方法parseInt
System.out.println("----------------");
//----------------------------------------------------------------------------------------------
//下面那行的String.valueOf是把Int类型转为String类型。先100+99,得199,把199转为字符串类型
convert2(100,i->String.valueOf(i+99));//注意这里直接简写了,不懂可以看看虚线上面的
System.out.println("----------------");
//-----------------------------------------------------------------------------------------------
//先把字符串转为整型,再把这个整型加上88,得188,再把188这个整型转为字符串型在控制台输出
convert3("100",s->Integer.parseInt(s),i->String.valueOf(i+88));
//用convert4方法(其内部是Function接口的andThen方法)优化一下上面那行的convert3方法
convert4("100",s->Integer.parseInt(s),i->String.valueOf(i+88));
}
//-------------------------------------------------------------------------------------------------------
//定义一个方法,把一个字符串转换为int类型,在控制台输出。`拿到String类型,返回Integer类型
private static void convert(String s, Function<String,Integer> fun){//注意int不能作为泛型,我们需要写int的包装类即Integer
Integer i = fun.apply(s);//这一行的左边可以也写int,因为系统会把int装箱为Integer类型
System.out.println(i);
}
//定义一个方法,把一个int类型的数据加上一个整数之后,转为字符串在控制台输出。`拿到Integer类型,返回String类型
private static void convert2(int i,Function<Integer,String> fun){
String s = fun.apply(i);
System.out.println(s);
}
//定义一个方法,把一个字符串转换为int类型,把int类型的数据加上一个整数之后,转为字符串在控制台输出。`同理,只不过有两个Function接口就是了
private static void convert3(String s,Function<String,Integer> fun1,Function<Integer,String> fun2){
Integer in = fun1.apply(s);
String st = fun2.apply(in);
System.out.println(st);
}
//上面那个convert3方法可以用我们这节课的Function接口的andThen方法,来进行优化。`同理,只不过有两个Function接口就是了
private static void convert4(String s,Function<String,Integer> fun1,Function<Integer,String> fun2){
String st = fun1.andThen(fun2).apply(s);//这里的convert4方法的效果跟上面的convert3方法是一样的
System.out.println(st);
}
}
Function接口_操作数据
练习: 1、String s = "张三,18"; 2.1、将字符串截取得到数字年龄部分 2.2、将上一步的年龄字符串转换成为int类型的数据 2.3、将上一步的int数据加70,得到一个int结果,在控制台输出 3、请通过Function接口来实现函数拼接
Function接口_操作数据的练习
xxxxxxxxxx
package ch25;
import java.util.function.Function;
public class a_12_1测试 {
public static void main(String[] args) {
//定义一个字符串
String s = "张三,18";
//调用最下面写好的convert方法
convert(s,(String ss)->{ //这个ss是自定义的
return s.split(",")[1];//将字符串截取得到数字年龄部分。这行的s写成ss也是对的哦,感兴趣可以思考一下逻辑
},(String ss)->{
return Integer.parseInt(ss);//将上一步的年龄字符串转换成为int类型的数据
},(Integer i)->{
return i + 70;//将上一步的int数据加70,得到一个int结果,在控制台输出
});
//用Lambda表达式的省略模式优化一下上面的代码,如下
convert(s,ss-> ss.split(",")[1],ss->Integer.parseInt(ss),i->i + 70);
//也可以使用方法引用来对Lambda表达式做一下优化,如下
convert(s,ss-> ss.split(",")[1],Integer::parseInt,i->i + 70);
}
//定义一个方法,实现我们在测试类里面的练习
private static void convert(String s,Function<String,String> fun1,Function<String,Integer> fun2,Function<Integer,Integer> fun3){
Integer i = fun1.andThen(fun2).andThen(fun3).apply(s);//左边的Integer可以写成int,因为系统会把int装箱为Integer
System.out.println(i);
}
}