第一点疑惑:看方法定义
default Function andThen(Function super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
看到default后面的了么,一般我们形参需要使用泛型的话,这个泛型定义在方法前面,换个例子看一下:
public static ApiResponse success(T data) {
return new ApiResponse<>(SUCCESS.getCode(), SUCCESS.getMsg(), data);
}
上面这个方法,形参是T类型的,返回值也是T类型的,而这个T,就定义在方法定义返回值前面,表示一个未知类型。
andThen方法的参数after泛型中的V就是这个意思,表示一个未知的类型,其实这里用什么表达都行,什么ABCDEFH,只是表达这个Lambda表达式的返回值。
第二点疑惑:这两个方法,andThen表示一个在外面那个Function执行之后调用,compose表示在外面那个Function执行之前调用。
我们看andThen定义:
default Function andThen(Function super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
andThen其实是定义了一个新的Function返回。
after.apply是执行andThen方法的形参的Lambda表达式,apply(this.apply)是执行当前Lambda表达式。
比如下面这个例子,我们定义两个表达式:
Function functionA = i -> i * 2;
Function functionB = i -> "-" + i;
functionA表示把参数乘以2,functionB表示把参数前面加个字符串"-",注意这两个的返回值不同。
调用andThen方法:
functionA.andThen(functionB).apply(2)
根据andThen的定义,上面的代码可以换成下面这个:
Function functionA = i -> i * 2;
Function functionB = i -> "-" + i;
Function functionC = t -> functionB.apply(functionA.apply(t));
在对比下andThen定义:
default Function andThen(Function super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
apply(this.apply)就是functionA.apply,after.apply就是functionB.apply
functionC就是andThen返回的新Function
我们调用functionC与调用functionA.andThen(functionB)是等价的。
在上面那个例子中:
functionA.andThen(functionB).apply(2);
Function functionA = i -> i * 2;
Function functionB = i -> "-" + i;
Function functionC = t -> functionB.apply(functionA.apply(t));
它们的返回值都是"-4"