java.util.function中 Function, Supplier, Consumer, Predicate和其他函数式接口广泛用在支持lambda表达式的API中。这些接口有一个抽象方法,会被lambda表达式的定义所覆盖。
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
static <T> Function<T, T> identity() {
return t -> t;
}
Function接口的主要作用是将一个给定的对象进行加工,然后返回加工后的对象,这个加工可以是任何操作.
其核心方法如下:
-
R apply(T t);
将一个给定的对象进行加工,然后返回加工后的对象,可以将该方法理解为一个一维函数,参数R是自变量,参数T是因变量.
-
default <V> Function<V, R> compose(Function<? super V, ? extends T> before)
组合函数,在调用当前function之前执行
-
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after)
组合函数,在调用当前function之后执行
-
static <T> Function<T, T> identity()
原函数,返回与参数一致的函数,即可以理解为 y = x.
下面对这些方法进行实例测试:
identity()
class Person{}
Function<Object, Object> function = Function.identity();
System.out.println(function.apply(100));
System.out.println(Function.identity().apply(100111));
Person person = new Person();
System.out.println(person == Function.identity().apply(person));
结果为:
100
100111
true
可以看到identity()返回的值与原值是一致的.
andThen()
我们现在用Function.andThen()来实现一个函数:y = 10x + 10;
Function<Integer,Integer> function = x -> x * 10;
function = function.andThen(x -> x+10);
System.out.println(function.apply(8));
结果为:
90
compose()
我们现在用Function.compose()来实现一个函数:y = 10 (10+x) + 10;
Function<Integer,Integer> function = (x -> x * 10);
function = function.compose(x -> x +10);
function = function.andThen(x -> x+10);
System.out.println(function.apply(8));
结果为:
190
与Function接口相关的接口:
-
BiFunction<T, U, R>
二维函数,可以理解成 z = kx + by,即对给定的两个参数U,R进行加工,生产T
-
DoubleFunction<R>
用于处理处理将其他类型转成double类型数据的Function
-
IntFunction<R>
用于处理处理将其他类型转成int类型数据的Function
-
LongFunction<R>
用于处理将其他类型转成long类型数据的Function
-
LongToIntFunction
用于处理将long转换成int的Function
-
LongToDoubleFunction
用于处理将long转换成double的Function
-
ToDoubleBiFunction<T, U>
用于处理将给定两个参数T,U转换成double类型的BiFunction
-
ToDoubleFunction<T>
用于处理将其他类型转换成double的Function
-
ToIntBiFunction<T, U>
用于处理将给定两个参数T,U转换成int类型的BiFunction
-
ToIntFunction<T>
用于处理将其他类型转换成int的Function
-
ToLongBiFunction<T, U>
用于处理将给定两个参数T,U转换成long类型的BiFunction
-
ToLongFunction<T>
用于处理将其他类型转换成long的Function