1. 程式人生 > 實用技巧 >淺析Java之Fucntion

淺析Java之Fucntion

今天在研究HashMap中我個人比較少用到方法的時候發現了這些:

立馬勾起了我學C#時的Function的回憶,經過自己研究,發現這個和C#的Function還真的挺像的,但是C#中Function引數可以傳遞無限多個,而這裡的Function引數至多兩個,好吧,跟我著我一起看下去吧~~

講的再清楚,也不如實際使用理解來的快,那麼我首先引人一下,如何使用的,然後我們再慢慢剖析:

輸出:

看的出來經過compute後我們指定的key的value變成了我們想要的2倍了,那麼它原理到底如何?開啟原始碼看一下:

我們可以看到原始碼內部呼叫apply傳入我們的key與value進行計算得到新的值,然後進行相應的操作

那麼為什麼我們可以使用lambda表示式進行重寫呢?我們開啟BiFunction內部看一下:

什麼意思呢?也就是即使內部我們有另外一個方法如:boolean equals(Object obj),也是仍然可以使用lambda表示式的,因為這個方法的輸入引數是型別固定的,如果換成boolean equals(T obj)這些就是不可以使用lambda表示式的了。

當然對於另外一個andThen方法,因為它被重寫了,因此相對整個介面而言,我們需要非固定引數的方法只有一個,因此滿足使用lambda表示式的規則!

當然對於其他的方法內部剖析和compute是一模一樣的,很簡單,這裡我就不花時間來拆分這些了。

對於Function其實和它是一樣的,因此我們仍然需要在使用的時候寫lambda表示式就可以重寫apply方法,繼而完成我們想要的功能,如下方:

    private void TestMethod3(){
        System.out.println(TestFunction("nxj", str -> str + "!"));
    }
    private String TestFunction(String name,Function<String, String> function){
        return function.apply(name);
    }

上方程式碼實現了將字串【nxj+!】作為一個新的字串進行返回,注意Function<輸入引數型別,輸出引數型別>

那麼我們自己實現一個結果模擬這個結果的功能吧:

    interface MyFunction<T, U, R> {
        R apply(T t, U u);
        boolean equals(Object obj);
        //這個程式碼我們暫時調不到
        default <V> MyFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
            Objects.requireNonNull(after);
            return (T t, U u) -> after.apply(apply(t, u));
        }
    }
    private void TestMethod4(){
        //這裡的lambda表示式實際上就是重寫apply方法
        System.out.println(TestMyFunction("nxj", "無敵",(k,v)->k.length()+v.length()));
    }
    private Integer TestMyFunction(String str,String str2,MyFunction<String,String,Integer> myFunction){
        return myFunction.apply(str,str2);
    }

OK,分享到這裡,希望你也可以學會哦~