摘要:函數式接口進階與默認方法詳解上一篇我們快速的借助示例演示了的簡單應用,體會到了使用對集合處理的便捷和其與函數式接口密不可分的關系,所以為了更高效的使用,有必要更熟練的掌握函數式接口。
Java8-5-函數式接口進階與默認方法詳解
上一篇我們快速的借助示例演示了stream api的簡單應用,體會到了使用stream api對集合處理的便捷和其與函數式接口密不可分的關系,所以為了更高效的使用stream api,有必要更熟練的掌握函數式接口。Java8中內置了大量的函數式接口,接下來我們選擇一些比較常用的一起學習下。
Function接口
在之前的文章中,我們簡單介紹過Function接口中apply方法的應用,除了apply這個抽象方法,Function接口中還內置了兩個比較常用的默認方法(接口中增加的有具體實現的方法,擴展了接口功能,子類默認會繼承該實現),看下Function接口源碼
/** * Represents a function that accepts one argument and produces a result. * *This is a functional interface * whose functional method is {@link #apply(Object)}. * * @param
the type of the input to the function * @param the type of the result of the function * * @since 1.8 */ @FunctionalInterface public interface Function { R apply(T t); /** * @return a composed function that first applies the {@code before} * function and then applies this function */ default Function compose(Function super V, ? extends T> before) { Objects.requireNonNull(before); return (V v) -> apply(before.apply(v)); } /** * @return a composed function that first applies this function and then * applies the {@code after} function */ default Function andThen(Function super R, ? extends V> after) { Objects.requireNonNull(after); return (T t) -> after.apply(apply(t)); } /** * 省略 */ }
Function接口定義中有兩個泛型,按著接口文檔說明第一個泛型是輸入類型,第二泛型是結果類型。
compose方法接收一個Function參數before,該方法說明是返回一個組合的函數,首先會應用before,然后應用當前對象,換句話說就是先執行before對象的apply,再執行當前對象的apply,將兩個執行邏輯串起來。
andThen方法接收一個Function參數after,與compose方法相反,它是先執行當前對象的apply方法,再執行after對象的方法??匆粋€應用示例
public class FunctionTest { public static void main(String[] args) { FunctionTest functionTest = new FunctionTest(); System.out.println(functionTest.compute1(5,i -> i * 2,i -> i * i));//50 System.out.println(functionTest.compute2(5,i -> i * 2,i -> i * i));//100 } public int compute1(int i, Functionafter,Function before){ return after.compose(before).apply(i); } public int compute2(int i, Function before,Function after){ return before.andThen(after).apply(i); } }
定義了compute1和compute2兩個方法,compute1方法第一個參數是要計算的數據,第二個參數是后執行的函數,第一個是先執行的函數,因為輸入輸出都是數字類型,所以泛型都指定為Integer類型,通過after.compose(before);將兩個函數串聯起來然后執行組合后的Funtion方法apply(i)。當調用compute1(5,i -> i 2,i -> i i)時,先平方再乘以2所以結果是50。而compute2方法對兩個Function的調用正好相反,所以結果是100。
BiFunction接口
接下來繼續看下另一個很常用的函數式接口BiFunction
/** * This is the two-arity specialization of {@link Function}. * @paramthe type of the first argument to the function * @param the type of the second argument to the function * @param the type of the result of the function * * @see Function * @since 1.8 */ @FunctionalInterface public interface BiFunction { /** * Applies this function to the given arguments. * * @param t the first function argument * @param u the second function argument * @return the function result */ R apply(T t, U u); /** * Returns a composed function that first applies this function to * its input, and then applies the {@code after} function to the result. * If evaluation of either function throws an exception, it is relayed to * the caller of the composed function. * * @param the type of output of the {@code after} function, and of the * composed function * @param after the function to apply after this function is applied * @return a composed function that first applies this function and then * applies the {@code after} function * @throws NullPointerException if after is null */ default BiFunction andThen(Function super R, ? extends V> after) { Objects.requireNonNull(after); return (T t, U u) -> after.apply(apply(t, u)); } }
實際上就是可以有兩個參數的Function,同樣前兩個泛型代表著入參的類型,第三個代表結果類型。
public class BiFunctionTest { public static void main(String[] args) { BiFunctionTest2 biFunctionTest2 = new BiFunctionTest2(); System.out.println(biFunctionTest2.compute(4,5,(a,b) -> a * b,a -> a * 2)); } public int compute(int a, int b, BiFunctionbiFunction, Function function){ return biFunction.andThen(function).apply(a,b); } }
看下compute方法,前兩個參數是待計算數據,第三個是一個BiFunction,因為入參和結果都是數組所以三個泛型都定義為Integer。最后一個參數是Function。計算邏輯是先執行BiFunction然后將結果傳給Funciton在計算最后返回結果,所以使用了andThen方法。我們想一下,BiFunction的andThen方法為什么接收的是Function類型的參數而不是BiFunction,答案很簡單,因為BiFunction的apply方法接收兩個參數,但是任何一個方法不可能有兩個返回值,所以也沒辦法放在BiFunction前面執行,這也是為什么BiFunction沒有compose方法的原因。
下一篇
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70689.html
以下是Java技術棧微信公眾號發布的關于 Java 的技術干貨,從以下幾個方面匯總。 Java 基礎篇 Java 集合篇 Java 多線程篇 Java JVM篇 Java 進階篇 Java 新特性篇 Java 工具篇 Java 書籍篇 Java基礎篇 8張圖帶你輕松溫習 Java 知識 Java父類強制轉換子類原則 一張圖搞清楚 Java 異常機制 通用唯一標識碼UUID的介紹及使用 字符串...
摘要:哪吒社區技能樹打卡打卡貼函數式接口簡介領域優質創作者哪吒公眾號作者架構師奮斗者掃描主頁左側二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領導們的談話,現在公司的現狀是碼農太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區Java技能樹打卡?【打卡貼 day2...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
閱讀 2071·2019-08-30 15:53
閱讀 3069·2019-08-30 15:44
閱讀 2916·2019-08-30 14:11
閱讀 2915·2019-08-30 14:01
閱讀 2701·2019-08-29 15:16
閱讀 3738·2019-08-29 13:10
閱讀 1243·2019-08-29 10:56
閱讀 2530·2019-08-26 13:58