最近项目上使用了很多Function类型的函数形参,同是使用了泛型,所以这里进行一下总结
Function 函数就是接受一个参数然后对这个参数进行处理,比如 Function
函数名称 | 类型 |
Function |
接收一个参数并返回结果的函数 |
BiFunction |
接收两个参数并返回结果的函数 |
DoubleFunction |
接收一个double的参数并返回结果的函数 |
一般我们经常使用的是Function
接口方法 | 方法描述 |
R apply(T t) | 将此参数应用到函数中 |
Function |
返回一个组合函数,该函数结果应用到after函数中 |
Function |
返回一个组合函数,首先将入参应用到before 函数,然后再将before函数结果应用到该函数中 |
/**
* 调用函数
* @param aimString 目标参数
* @param firstFunction 第一个处理函数
*/
public void andApplyFunction(String aimString, Function firstFunction) {
Integer aimResult = firstFunction.apply(aimString);
System.out.println("最后的结果为----"+ aimResult);
}
调用:
andApplyFunction("12", aimString -> Integer.parseInt(aimString + 12));
上面代码就是说明, 我将参数类型为String,值为12的形参对象传递进函数,而firstFunction 定义表示我接收一个String 类型,返回一个Integer 型,对应的处理逻辑是将aimString 加上12 后转为Integer 返回。
或者
andApplyFunction("12",Integer::parseInt);
上面的代码说明Function 是一个Integer::partInt (是一个lamda表达式,即 paramString -> Integer.parseInt(paramString))
andThen 函数就是将调用者返回的结果传递给下一个函数
/**
* 调用对应的andThen方法
*
* @param firstFunction 第一个处理函数
* @param secondFunction 第二个处理函数
*/
public void andThenTest(String aimString, Function firstFunction, Function secondFunction) {
String aimResult = firstFunction.andThen(secondFunction).apply(aimString);
System.out.println("最后的结果");
}
调用方式:
andThenTest("12", (s -> Integer.parseInt(s)), s -> s + "need");
上面代码,传递的参数是值为12的字符串,然后对应的第一个参数为 s->Integer.parseInt(s), 第二个参数为接收 Integer类型的参数,然后将这个参数加上 “need" 后返回。
compose 函数就是说明先将参数应用与第二个函数中,然后再将处理后的结果应用于第一个函数中。
/**
* 调用的对应 compose 函数 其中compose 表示 先执行after 函数,然后再执行first 函数
* @param aimString 处理的参数
* @param firstFunction 第一个处理函数
* @param secondFunction 第二个处理函数
*/
public void andCompostTest(Integer aimString, Function firstFunction, Function secondFunction) {
Integer aimResult = firstFunction.compose(secondFunction).apply(aimString);
System.out.println("最后的结果为---" + aimResult);
}
andCompostTest(12, Integer::parseInt, aimString -> 12 + "12");
这里就是将参数为12的形参先加上"12" ,然后将结果返回到第一个函数中,最后调用Integer::parseInt 处理 进行返回。
上面的方法传入的参数是已经被定义好的,但是在实际运用中,这样复用程度低。所以就需要运用泛型进行统一处理形式的定义。
public static U convertTemplate(String aimString, Function function) {
U apply = function.apply(aimString);
System.out.println("产生的结果为---" + apply);
return apply;
}
convertTemplate("12" , Integer::parseInt);
上面的代码中,定义了一个泛型 U 然后要求传入的的结果为String,转化后的结果为U。返回后的结果类型也为U.
这样一来的话我们就可以将对应的入参String 转化成多种结果了。(上面是转化成了Integer)
或者也可以这样调用
convertTemplate("12", s-> s.replace("_",""));
或者
convertTemplate("true",Boolean::valueOf);
你甚至可以使用两个泛型来定义Function 函数形参
public static T convertTemplate(U aimParam, Function function) {
T t = function.apply(aimParam);
return t;
}
convertTemplate("123", Integer::parseInt);
Function函数定义基本上是规定了一个入参和出参。传入的对参数的处理逻辑。然后要么直接apply ,要么还需要再处理可以用andThen、andCompose 进行二次处理。 可以定义泛型这样就可以不用规定出参和入参的形式了。