Function接口的使用文档
Function接口的使用文档
参考资料地址1 :
Java 8 中 Function 接口使用方法介绍
01 apply方法
Function是一个函数式接口,里面只有一个抽象方法叫做apply R apply(T t):对数据进行处理,然后返回结果。
源码
//T是参数的泛型,R是返回值的泛型
@FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
}
使用示例
/**
* apply
* 对数据进行处理,然后返回结果
*/
@Test
public void test0() {
//
Function<Integer,String> function=new Function<Integer, String>() {
@Override
public String apply(Integer num) {
return num*8+" 元";
}
};
//美元兑换人民币
String rmb = function.apply(1);
System.out.println("兑换后的币值为: "+rmb);
}
02 compose 方法
- compose 的使用示例,用于组合逻辑
- 如果function为一个的规则,那么通过compose就可以制定哪个规则先执行
- compose是传入的规则先执行,然后将执行后的结果当作参数再传入调用者,调用者再按它的规制处理
源码
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
理解:
看源码,传入的function函数先调用apply方法 ,调用者再执行apply方法,参数为前面的执行结果
使用示例
/**
* compose 的使用示例,用于组合逻辑
* 如果function为一个的规则,那么通过compose就可以制定那个规则先执行
* compose是传入的规则先执行,然后将执行后的结果当作参数再传入调用者,调用者再按他的规制处理
*/
@Test
public void test2() {
Function<Integer, Integer> function1 = s -> s * 5;
Function<Integer, Integer> function2 = s -> s + 5;
Function<Integer, Integer> function3 = function2.compose(function1);
// 先乘5 然后得到的结果再加5
// (5*5)+5=30
Integer result = function3.apply(5);
System.out.println(result);
}
03 andThen方法
源码
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
使用示例
/**
* andThen 的使用示例
* andThen与compose的原理类似,不过是传入的规则后执行
*/
@Test
public void test3() {
Function<Integer, Integer> function1 = s -> s * 5;
Function<Integer, Integer> function2 = s -> s + 5;
Function<Integer, Integer> function3 = function2.andThen(function1);
// (5+5)*5=50
Integer result = function3.apply(5);
System.out.println(result);
}
04 identity方法
始终返回一个其输入参数的函数。
static <T> Function<T, T> identity() {
return t -> t;
}
使用示例
/**
* identity 的使用示例1
* 用于将list集合转换成以id为key,value为对象本身的map集合
*/
@Test
public void test4() {
List<Stu> list = new ArrayList<>();
list.add(new Stu(12, "小花"));
list.add(new Stu(13, "小红"));
Map<Integer, Stu> map = list.stream().collect(Collectors.toMap(Stu::getId, Function.identity()));
System.out.println(map);
//{12=FunctionTest.Stu(id=12, name=小花), 13=FunctionTest.Stu(id=13, name=小红)}
}
@Data
@AllArgsConstructor
class Stu {
Integer id;
String name;
}
05 实际应用
检查参数
思路
: 将每一个检查规制写成function,校验时随意组合即可
//长度检测
private static final Function<String, String> lengthCheck = params -> {
if (params.length() > 100) {
throw new RuntimeException("Length exceed max limit.");
}
return params;
};
//参数检测,以逗号隔开,开头和结尾都不能有逗号
private static final Function<String, String> invalidParamCheck = str -> {
if (!str.matches("^\\d+(,\\d+)*$")) {
throw new RuntimeException("is invalid param");
}
return str;
};
/**
* 这里的公共方法组合了该类中的基本校验逻辑构成一个复合的逻辑
*/
public static void checkStringLengthAndPhoneNumber(String string) {
//先检查长度 后检查是否有效
invalidParamCheck.compose(lengthCheck).apply(string);
}
@Test
public void test5() {
checkStringLengthAndPhoneNumber("456,12,45");
}