1. 程式人生 > >Java8的Function介面學習(compose和andThen)

Java8的Function介面學習(compose和andThen)

Java8增加了函數語言程式設計這一新特性,我這幾天也在慢慢學習,現在就來講講Function介面。

何為Function介面?

在java8以後的介面可以有介面方法的預設實現了,如下所示,Function介面主要程式碼及個人整理註釋:

/**
 * 代表這一個方法,能夠接受引數,並且返回一個結果
 * @since 1.8
 */
@FunctionalInterface
public interface Function<T, R> {
    /**
     * 將引數賦予給相應方法
     * 
     * @param t
     * @return
     */
R apply(T t); /** * 先執行引數(即也是一個Function)的,再執行呼叫者(同樣是一個Function) */ default <V> Function<V, R> compose(Function<? super V, ? extends T> before) { Objects.requireNonNull(before); return (V v) -> apply(before.apply(v)); } /** * 先執行呼叫者,再執行引數,和compose相反。 */
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類的具體程式碼,裡面有四個方法,分別是applycomposeandThenidentity,具體的方法註釋解除安裝程式碼裡面了,主要我想在這裡敲敲黑板,就是他們的返回值,apply是R,也就是代表最終返回結果,其他三個都是返回一個Function,也就是他們借個是可以進行更多的後層巢狀的,類似於建造者模式去生成類的過程。

具體例子

講的太抽象,確實,這裡放出一個具體例子助於理解:

    public static void main(String[] args) {
        Function<Integer, Integer> times2 = i -> i*2;
        Function<Integer, Integer> squared = i -> i*i;

        System.out.println(times2.apply(4));
        System.out.println(squared.apply(4));

        System.out.println(times2.compose(squared).apply(4));  //32                先4×4然後16×2,先執行apply(4),在times2的apply(16),先執行引數,再執行呼叫者。
        System.out.println(times2.andThen(squared).apply(4));  //64               先4×2,然後8×8,先執行times2的函式,在執行squared的函式。

        System.out.println(Function.identity().compose(squared).apply(4));   //16
    }

程式碼裡面有點註釋,當然輸出結果為:

8
16
32
64
16

前兩個輸出比較容易理解,就是把引數值賦值到方法裡面,再由apply返回的結果輸出即可。
主要就是第3,4個的compose和andThen,由於程式碼裡面是很簡單兩個數學計算,先說明大概流程,估計推一推就懂了。

在compose裡面,先執行squared的apply(4)方法,然後再把結果給times2讓他去執行16×2的方法。
而andThen恰恰相反,由英文來理解,先後順序,即先執行times2的apply方法,再把結果執行squared的apply方法。
這樣,就能得到最終的結果。

而在最後一個輸出中,雖然有compose方法,但是前一個的Function.identity並沒有任何方法,因為identity僅僅是返回一個方法,所以也就執行了squared這一個方法而已。

通過上文的分析,大概可以理解Function這個類了,就是一個方法,有種c++裡面函式指標的感覺,一個變數可以指向一個方法,並且可以把兩個方法組合起來使用(使用compose和andThen),而可以通過identity這個靜態方法來獲取當前執行的方法。