JDK 8 -- Function接口: apply, compose, andThen

1 Function<T, R>中的T, R表示接口輸入、輸出的數(shù)據(jù)類型搓译。

  • R apply(T t)
    public class FunctionTest {
    public static void main(String[] args) {
    FunctionTest functionTest = new FunctionTest();
    // return e + 5;就是apply方法的具體實(shí)現(xiàn)
    Function<Integer, Integer> func = e -> {return e + 5;};
    int result = functionTest.calculate(5, func);
    System.out.println(result);
    }

    //對單個(gè)參數(shù)進(jìn)行抽象的處理,而具體的處理邏輯在調(diào)用時(shí)傳入:即傳遞的是一種操作    
    public int calculate(Integer a, Function<Integer, Integer> function) {        
        return function.apply(a);    
    } 
    
  • func是定義好的Function接口類型的變量脐湾,他的輸入诚撵、輸出都是Integer類型。

  • 調(diào)用calculate方法時(shí)颤枪,將func作為參數(shù)傳入,對參數(shù)5進(jìn)行處理淑际。

  • 因此畏纲,Function接口抽象出了一種對單個(gè)參數(shù)進(jìn)行處理的操作。而具體的處理邏輯在調(diào)用時(shí)傳入:即傳遞的是一種操作春缕。

  • andThen

    • 先處理參數(shù)盗胀,再對返回值使用操作after進(jìn)行處理。
      Function<Integer, Integer> func = e -> {return e + 5;};
      Function<Integer, Integer> func2 = e -> {return e * 5;};
      //func2即after
      func.andThen(func2).apply(5); // 50
  • compose

    • andThen剛好相反:先使用操作before處理參數(shù)锄贼,再對返回值進(jìn)行處理票灰。
      Function<Integer, Integer> func = e -> {return e + 5;};
      Function<Integer, Integer> func2 = e -> {return e * 5;};
      //func2即before
      func.compose(func2).apply(5); // 30
    • compose源碼
      default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
      Objects.requireNonNull(before);
      return (V v) -> apply(before.apply(v));//第一個(gè)apply是調(diào)用當(dāng)前接口的方法
      }
    • 注意compose方法的返回值依然是Function<T, R>類型,所以不是
      return this.apply(before.apply(v));
  • 擴(kuò)展組合Function

        public class FunctionTest2 {    
              public static void main(String[] args) {        
                    FunctionTest2 functionTest2 =  new FunctionTest2(); 
                    int result1 = functionTest2.compute(5, e -> e * 5, e -> e + 5);        
                    int result2 = functionTest2.compute2(5, e -> e * 5, e -> e + 5);       
                    int result3 = functionTest2.compute3(5, e -> e * 5, e -> e + 5);        
                    int result4 = functionTest2.compute4(5, e -> e * 5, e -> e + 5);       
                    System.out.println(result1);//50  
                    System.out.println(result2);//30      
                    System.out.println(result3);//130   
                    System.out.println(result4);//250    
              }    
    
              public int compute(int source, Function<Integer, Integer> function1, Function<Integer, Integer> function2) {        
                     return function1.compose(function2).apply(source);   
              }    
              public int compute2(int source, Function<Integer, Integer> function1, Function<Integer, Integer> function2) {        
                     return function1.andThen(function2).apply(source);    
              }    
              public int compute3(int source, Function<Integer, Integer> function1, Function<Integer, Integer> function2) {        
                    return function1.andThen(function2).compose(function1).apply(source); //從后往前    
              }    
              public int compute4(int source, Function<Integer, Integer> function1, Function<Integer, Integer> function2) {        
                    return function1.compose(function2).andThen(function1).apply(source);    }
              }
    

2 BiFunction<T, U, R>中的T, U表示接口輸入的第一、第二個(gè)參數(shù)屑迂、R是輸出的數(shù)據(jù)類型浸策。

 public class BIFunctionTest {    
       public static void main(String[] args) {        
              //定義BiFunction對象,并調(diào)用apply方法
              BiFunction<Integer, String, Integer> biFunction = (t, u) -> {
                                         return t + Integer.parseInt(u);
                                    };   
              System.out.println(biFunction.apply(5, "6")); //11   
              
              System.out.println("------------------------------------------");        
              
              //方法調(diào)用時(shí)惹盼,作為參數(shù)(操作)傳入        
              BIFunctionTest biFunctionTest = new BIFunctionTest();      
              int result = biFunctionTest.compute(5, 6, (t, u) -> {return t + u;});        
              System.out.println(result); //11        
              
              //BiFunction與Function的組合       
              int result2 = biFunctionTest.compute2(5, 6, (t, u) -> {return t + u;}, t -> t * t);        
              System.out.println(result2); //121    
       }    

       public int compute(Integer a, Integer b, BiFunction<Integer, Integer, Integer> biFunction) {
              return biFunction.apply(a, b);    
       }    

       //BIFunction的返回作為Function的輸入    
       public int compute2(Integer a, Integer b, BiFunction<Integer, Integer, Integer> biFunction, Function<Integer, Integer> function) {       
             return biFunction.andThen(function).apply(a, b);   
       }}
  • 注意庸汗,BiFunction中沒有compose默認(rèn)函數(shù)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末手报,一起剝皮案震驚了整個(gè)濱河市蚯舱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掩蛤,老刑警劉巖枉昏,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盏档,居然都是意外死亡凶掰,警方通過查閱死者的電腦和手機(jī)燥爷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門蜈亩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人前翎,你說我怎么就攤上這事稚配。” “怎么了港华?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵道川,是天一觀的道長。 經(jīng)常有香客問我立宜,道長冒萄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任橙数,我火速辦了婚禮尊流,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灯帮。我一直安慰自己崖技,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布钟哥。 她就那樣靜靜地躺著迎献,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腻贰。 梳的紋絲不亂的頭發(fā)上吁恍,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼冀瓦。 笑死鸦采,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咕幻。 我是一名探鬼主播渔伯,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肄程!你這毒婦竟也來了锣吼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蓝厌,失蹤者是張志新(化名)和其女友劉穎玄叠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拓提,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡读恃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了代态。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寺惫。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹦疑,靈堂內(nèi)的尸體忽然破棺而出西雀,到底是詐尸還是另有隱情,我是刑警寧澤歉摧,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布艇肴,位于F島的核電站,受9級特大地震影響叁温,放射性物質(zhì)發(fā)生泄漏再悼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一膝但、第九天 我趴在偏房一處隱蔽的房頂上張望冲九。 院中可真熱鬧,春花似錦锰镀、人聲如沸娘侍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憾筏。三九已至,卻和暖如春花鹅,著一層夾襖步出監(jiān)牢的瞬間氧腰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留古拴,地道東北人箩帚。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像黄痪,于是被迫代替她去往敵國和親紧帕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容