Function 接口
- JDK8新增的函数式接口
- 接口只有一个抽象方法apply, 接受一个T类型参数, 返回一个R类型参数, T, R表示泛型, 可以相同
- 除了一个抽象的apply方法之外, Function存在两个默认的default方法, compose和andThen, 这两个方法都是用来组合不同的Function的
- 这个函数式接口被大量应用于集合以及Stream(流)中
apply 方法
R apply(T t);
compose 方法
/**
* 接口默认方法
* 组合两个函数方法, 返回一个新的函数
* before的apply方法输入一个V类型的参数, 返回一个T类型的参数
* 当前的Funtion的apply方法是输入一个T类型的参数, 返回一个R类型的参数
* 两个函数组合之后, 返回一个新的Function, 新的Function输入一个V类型的参数, 返回一个R类型的参数
* 简单来说, 入参功能 : V -> T, 当前函数功能 : T -> R, 返回函数功能 : V -> R
*/
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
// 非空判断
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
andThen 方法
/**
* 组合两个函数方法, 返回一个新的函数
* after的apply方法输入一个R类型的参数, 返回一个V类型的参数
* 当前的Funtion的apply方法是输入一个T类型的参数, 返回一个R类型的参数
* 两个函数组合之后, 返回一个新的Function, 新的Function输入一个T类型的参数, 返回一个V类型的参数
* 简单来说, 入参功能 : R -> V, 当前函数功能 : T -> R, 返回函数功能 : T -> V
*/
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
// 非空判断
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
API使用样例
public static void main(String[] args) {
Function<Integer, Integer> function1 = value -> value * 2;
Function<Integer, Integer> function2 = value -> value + 3;
Function<Integer, Integer> function3 = function1.compose(function2);
Function<Integer, Integer> function4 = function1.andThen(function2);
System.out.println("function3 : " + function3.apply(2));
System.out.println