JDK8 - Function介紹

注:寫這個文檔只是爲了方便加深記憶,增強理解,重點關注兩個default方法中泛型【V】。linux

JDK8做爲一個還在維護階段的長期版本,勢必會在企業應用中佔據至關大的市場份額,因此仍是以JDK8做爲例子的背景。(下一個長期版本是今年9月發佈的JDK11)app

 函數接口定義:ide

Interface Function<T,R>函數

這裏稍稍說明一下接口中的<T,R>泛型的含義spa

  • T 函數的輸入類型
  • R 函數的輸出類型

接口內還有第三個泛型,重點關注接口

  • V after函數的輸出類型和before函數的輸入類型

 

接口中定義了4個方法,其中apply是抽象方法,其他的三個是接口自帶,不須要實現。這裏定義當前函數的名稱爲currentFunc。文檔

  • R apply(T t)

  此方法爲函數的執行入口,傳入T,輸出R。全部標註了@FunctionalInterface註解的接口,最好都按照這個規範來定義此方法。it

  • 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'io

  • 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的輸出類型。test

  • static <T> Function<T, T> identity()

  此靜態方法的做用比較單一,返回函數定義中的入參【T】

相關文章
相關標籤/搜索