注:寫這個文檔只是為了方便加深記憶,加強理解,重點關注兩個default方法中泛型【V】。
JDK8作為一個還在維護階段的長期版本,勢必會在企業應用中占據相當大的市場份額,所以還是以JDK8作為例子的背景。(下一個長期版本是今年9月發布的JDK11)
函數接口定義:
Interface Function<T,R>
這里稍稍說明一下接口中的<T,R>泛型的含義
- T 函數的輸入類型
- R 函數的輸出類型
接口內還有第三個泛型,重點關注
- V after函數的輸出類型和before函數的輸入類型
接口中定義了4個方法,其中apply是抽象方法,其余的三個是接口自帶,不需要實現。這里定義當前函數的名稱為currentFunc。
- R apply(T t)
此方法為函數的執行入口,傳入T,輸出R。所有標注了@FunctionalInterface注解的接口,最好都按照這個規范來定義此方法。
- default <V> Function<T, V> andThen(Function<? super R, ? extends V> after)
此方法的參數一個后置函數,執行順序:after.apply( currentFunc.apply(t))。這里我們看看after函數的定義:Function<? super R, ? extends V> after,入參是R,輸出是V,也就是說,currentFunc函數的輸出[R]直接作為了after函數的入參,最終[andThen]方法的返回值:Function<T, V>,T -> currentFunc的入參,V -> after的輸出類型。有過linux命令操作的朋友對此應該比較熟悉,類似於linux的管道命令,前者的輸出直接當成后續命令的輸入,如:cat test.txt | grep 'XXXX'
- default <V> Function<V, R> compose(Function<? super V, ? extends T> before)
此方法的參數一個前置函數,執行順序:currentFunc.apply( before.apply(t)),before的入參類型為V,輸出值類型為T;其中before的輸出值[T]直接作為currentFunc的入參。[compose]方法返回函數:Function<V, R>,V -> before的入參,R -> currentFunc的輸出類型。
- static <T> Function<T, T> identity()
此靜態方法的作用比較單一,返回函數定義中的入參【T】