成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Java8-5-Function函數(shù)式接口進(jìn)階與默認(rèn)方法詳解

Miracle_lihb / 3502人閱讀

摘要:函數(shù)式接口進(jìn)階與默認(rèn)方法詳解上一篇我們快速的借助示例演示了的簡(jiǎn)單應(yīng)用,體會(huì)到了使用對(duì)集合處理的便捷和其與函數(shù)式接口密不可分的關(guān)系,所以為了更高效的使用,有必要更熟練的掌握函數(shù)式接口。

Java8-5-函數(shù)式接口進(jìn)階與默認(rèn)方法詳解
上一篇我們快速的借助示例演示了stream api的簡(jiǎn)單應(yīng)用,體會(huì)到了使用stream api對(duì)集合處理的便捷和其與函數(shù)式接口密不可分的關(guān)系,所以為了更高效的使用stream api,有必要更熟練的掌握函數(shù)式接口。Java8中內(nèi)置了大量的函數(shù)式接口,接下來(lái)我們選擇一些比較常用的一起學(xué)習(xí)下。

Function接口
在之前的文章中,我們簡(jiǎn)單介紹過(guò)Function接口中apply方法的應(yīng)用,除了apply這個(gè)抽象方法,F(xiàn)unction接口中還內(nèi)置了兩個(gè)比較常用的默認(rèn)方法(接口中增加的有具體實(shí)現(xiàn)的方法,擴(kuò)展了接口功能,子類(lèi)默認(rèn)會(huì)繼承該實(shí)現(xiàn)),看下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 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 after) { Objects.requireNonNull(after); return (T t) -> after.apply(apply(t)); } /** * 省略 */ }

Function接口定義中有兩個(gè)泛型,按著接口文檔說(shuō)明第一個(gè)泛型是輸入類(lèi)型,第二泛型是結(jié)果類(lèi)型。
compose方法接收一個(gè)Function參數(shù)before,該方法說(shuō)明是返回一個(gè)組合的函數(shù),首先會(huì)應(yīng)用before,然后應(yīng)用當(dāng)前對(duì)象,換句話(huà)說(shuō)就是先執(zhí)行before對(duì)象的apply,再執(zhí)行當(dāng)前對(duì)象的apply,將兩個(gè)執(zhí)行邏輯串起來(lái)。
andThen方法接收一個(gè)Function參數(shù)after,與compose方法相反,它是先執(zhí)行當(dāng)前對(duì)象的apply方法,再執(zhí)行after對(duì)象的方法??匆粋€(gè)應(yīng)用示例

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, Function after,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兩個(gè)方法,compute1方法第一個(gè)參數(shù)是要計(jì)算的數(shù)據(jù),第二個(gè)參數(shù)是后執(zhí)行的函數(shù),第一個(gè)是先執(zhí)行的函數(shù),因?yàn)檩斎胼敵龆际菙?shù)字類(lèi)型,所以泛型都指定為Integer類(lèi)型,通過(guò)after.compose(before);將兩個(gè)函數(shù)串聯(lián)起來(lái)然后執(zhí)行組合后的Funtion方法apply(i)。當(dāng)調(diào)用compute1(5,i -> i 2,i -> i i)時(shí),先平方再乘以2所以結(jié)果是50。而compute2方法對(duì)兩個(gè)Function的調(diào)用正好相反,所以結(jié)果是100。

BiFunction接口
接下來(lái)繼續(xù)看下另一個(gè)很常用的函數(shù)式接口BiFunction

/**
 * This is the two-arity specialization of {@link Function}.
 * @param  the 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 after) {
        Objects.requireNonNull(after);
        return (T t, U u) -> after.apply(apply(t, u));
    }
}

實(shí)際上就是可以有兩個(gè)參數(shù)的Function,同樣前兩個(gè)泛型代表著入?yún)⒌念?lèi)型,第三個(gè)代表結(jié)果類(lèi)型。

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, BiFunction biFunction,
                       Function function){
        return biFunction.andThen(function).apply(a,b);
    }
}

看下compute方法,前兩個(gè)參數(shù)是待計(jì)算數(shù)據(jù),第三個(gè)是一個(gè)BiFunction,因?yàn)槿雲(yún)⒑徒Y(jié)果都是數(shù)組所以三個(gè)泛型都定義為Integer。最后一個(gè)參數(shù)是Function。計(jì)算邏輯是先執(zhí)行BiFunction然后將結(jié)果傳給Funciton在計(jì)算最后返回結(jié)果,所以使用了andThen方法。我們想一下,BiFunction的andThen方法為什么接收的是Function類(lèi)型的參數(shù)而不是BiFunction,答案很簡(jiǎn)單,因?yàn)锽iFunction的apply方法接收兩個(gè)參數(shù),但是任何一個(gè)方法不可能有兩個(gè)返回值,所以也沒(méi)辦法放在BiFunction前面執(zhí)行,這也是為什么BiFunction沒(méi)有compose方法的原因。

下一篇

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70689.html

相關(guān)文章

  • Java核心技術(shù)教程整理,長(zhǎng)期更新

    以下是Java技術(shù)棧微信公眾號(hào)發(fā)布的關(guān)于 Java 的技術(shù)干貨,從以下幾個(gè)方面匯總。 Java 基礎(chǔ)篇 Java 集合篇 Java 多線程篇 Java JVM篇 Java 進(jìn)階篇 Java 新特性篇 Java 工具篇 Java 書(shū)籍篇 Java基礎(chǔ)篇 8張圖帶你輕松溫習(xí) Java 知識(shí) Java父類(lèi)強(qiáng)制轉(zhuǎn)換子類(lèi)原則 一張圖搞清楚 Java 異常機(jī)制 通用唯一標(biāo)識(shí)碼UUID的介紹及使用 字符串...

    Anchorer 評(píng)論0 收藏0
  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹(shù)打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無(wú)意間聽(tīng)到領(lǐng)導(dǎo)們的談話(huà),現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹(shù)打卡?【打卡貼 day2...

    Scorpion 評(píng)論0 收藏0
  • 關(guān)于Vue2一些值得推薦的文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...

    sutaking 評(píng)論0 收藏0
  • 關(guān)于Vue2一些值得推薦的文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...

    khs1994 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Miracle_lihb

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<