java.util.function中 Function, Supplier, Consumer, Predicate和其他函數(shù)式接口廣泛用在支持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);
將一個給定的對象進行加工,然后返回加工后的對象,可以將該方法理解為一個一維函數(shù),參數(shù)R是自變量,參數(shù)T是因變量.
-
default <V> Function<V, R> compose(Function<? super V, ? extends T> before)
組合函數(shù),在調(diào)用當前function之前執(zhí)行
-
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after)
組合函數(shù),在調(diào)用當前function之后執(zhí)行
-
static <T> Function<T, T> identity()
原函數(shù),返回與參數(shù)一致的函數(shù),即可以理解為 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));
結(jié)果為:
100
100111
true
可以看到identity()返回的值與原值是一致的.
andThen()
我們現(xiàn)在用Function.andThen()來實現(xiàn)一個函數(shù):y = 10x + 10;
Function<Integer,Integer> function = x -> x * 10;
function = function.andThen(x -> x+10);
System.out.println(function.apply(8));
結(jié)果為:
90
compose()
我們現(xiàn)在用Function.compose()來實現(xiàn)一個函數(shù):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));
結(jié)果為:
190
與Function接口相關(guān)的接口:
-
BiFunction<T, U, R>
二維函數(shù),可以理解成 z = kx + by,即對給定的兩個參數(shù)U,R進行加工,生產(chǎn)T
-
DoubleFunction<R>
用于處理處理將其他類型轉(zhuǎn)成double類型數(shù)據(jù)的Function
-
IntFunction<R>
用于處理處理將其他類型轉(zhuǎn)成int類型數(shù)據(jù)的Function
-
LongFunction<R>
用于處理將其他類型轉(zhuǎn)成long類型數(shù)據(jù)的Function
-
LongToIntFunction
用于處理將long轉(zhuǎn)換成int的Function
-
LongToDoubleFunction
用于處理將long轉(zhuǎn)換成double的Function
-
ToDoubleBiFunction<T, U>
用于處理將給定兩個參數(shù)T,U轉(zhuǎn)換成double類型的BiFunction
-
ToDoubleFunction<T>
用于處理將其他類型轉(zhuǎn)換成double的Function
-
ToIntBiFunction<T, U>
用于處理將給定兩個參數(shù)T,U轉(zhuǎn)換成int類型的BiFunction
-
ToIntFunction<T>
用于處理將其他類型轉(zhuǎn)換成int的Function
-
ToLongBiFunction<T, U>
用于處理將給定兩個參數(shù)T,U轉(zhuǎn)換成long類型的BiFunction
-
ToLongFunction<T>
用于處理將其他類型轉(zhuǎn)換成long的Function