Function接口 – Java8中java.util.function包下的函數式接口

jopen 9年前發布 | 182K 次閱讀 Function Java開發

作者: Mohamed Sanaulla 譯者: 李璟(jlee381344197@gmail.com)

早先我寫了一篇《函數式接口》,探討了Java8中函數式接口的用法。如果你正在瀏覽Java8的API,你會發現java.util.function中 Function, Supplier, Consumer, Predicate和其他函數式接口廣泛用在支持lambda表達式的API中。這些接口有一個抽象方法,會被lambda表達式的定義所覆蓋。在這篇文章中,我會簡單描述Function接口,該接口目前已發布在java.util.function中。

Function接口的主要方法:

R apply(T t) – 將Function對象應用到輸入的參數上,然后返回計算結果。

default ?V? Function?T,V? – 將兩個Function整合,并返回一個能夠執行兩個Function對象功能的Function對象。

譯者注:Function接口中除了apply()之外全部接口如下:

default <V> Function<T,V> andThen(Function<? super R,? extends V> after) 返回一個先執行當前函數對象apply方法再執行after函數對象apply方法的函數對象。

default <V> Function<T,V> compose(Function<? super V,? extends T> before)返回一個先執行before函數對象apply方法再執行當前函數對象apply方法的函數對象。

static <T> Function<T,T> identity() 返回一個執行了apply()方法之后只會返回輸入參數的函數對象。

本章節將會通過創建接受Function接口和參數并調用相應方法的例子探討apply方法的使用。我們同樣能夠看到API的調用者如何利用lambda表達式替代接口的實現。除了傳遞lambda表達式之外,API使用者同樣可以傳遞方法的引用,但這樣的例子不在本篇文章中。

如果你想把接受一些輸入參數并將對輸入參數處理過后的結果返回的功能封裝到一個方法內,Function接口是一個不錯的選擇。輸入的參數類型和輸出的結果類型可以一致或者不一致。

一起來看看接受Function接口實現作為參數的方法的例子:

public class FunctionDemo {

    //API which accepts an implementation of

    //Function interface

    static void modifyTheValue(int valueToBeOperated, Function<Integer, Integer> function){

        int newValue = function.apply(valueToBeOperated);

        /*     
         * Do some operations using the new value.     
         */

        System.out.println(newValue);

    }

}

下面是調用上述方法的例子:

public static void main(String[] args) {

    int incr = 20;  int myNumber = 10;

    modifyTheValue(myNumber, val-> val + incr);

    myNumber = 15;  modifyTheValue(myNumber, val-> val * 10);

    modifyTheValue(myNumber, val-> val - 100);

    modifyTheValue(myNumber, val-> "somestring".length() + val - 100);

}

你可以看到,接受1個參數并返回執行結果的lambda表達式創建在例子中。這個例子的輸入如下:

30

150

-85

-75

 

原創文章,轉載請注明: 轉載自并發編程網 – ifeve.com

本文鏈接地址: Function接口 – Java8中java.util.function包下的函數式接口

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!