1. 程式人生 > >Function介面 – Java8中java.util.function包下的函式式介面

Function介面 – Java8中java.util.function包下的函式式介面

作者:   Mohamed Sanaulla  譯者: 李璟([email protected])

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

Function介面的主要方法:

– 將Function物件應用到輸入的引數上,然後返回計算結果。

– 將兩個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