淺析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,分享到這裡,希望你也可以學會哦~