真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java8的Function怎么使用

本篇內(nèi)容介紹了“Java8的Function怎么使用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

專注于為中小企業(yè)提供網(wǎng)站制作、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)民樂免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了近1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

Java8 添加了一個(gè)新的特性Function,顧名思義這一定是一個(gè)函數(shù)式的操作。我們知道Java8的最大特性就是函數(shù)式接口。所有標(biāo)注了@FunctionalInterface注解的接口都是函數(shù)式接口,具體來說,所有標(biāo)注了該注解的接口都將能用在lambda表達(dá)式上。

標(biāo)注了@FunctionalInterface的接口有很多,但此篇我們主要講Function,了解了Function其他的操作也就很容易理解了。

@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));
    }
}

為了方便地閱讀源碼,我們需要了解一些泛型的知識(shí),如果你對泛型已經(jīng)很熟悉了,那你可以跳過這段 。

泛型是JDK1.5引入的特性,通過泛型編程可以使編寫的代碼被很多不同的類型所共享,這可以很好的提高代碼的重用性。因?yàn)楸酒攸c(diǎn)不是介紹泛型,所以我們只關(guān)注上述Function源碼需要用到的泛型含義。

1. 泛型類

泛型類使用來表示該類為泛型類,其內(nèi)部成員變量和函數(shù)的返回值都可以為泛型 ,F(xiàn)unction源碼的標(biāo)識(shí)為,也就是兩個(gè)泛型參數(shù),此處不再贅述,具體泛型類可以看網(wǎng)上的文章。

2. 泛型方法和通配符

在方法修飾符的后面加一個(gè)表明該方法為泛型方法,如Function 的源碼里的compose方法的。通配符也很好理解,還是compose的例子,我們可以看到compose的參數(shù)為一個(gè)Function類型,其中Functin的參數(shù)指定了其第一個(gè)參數(shù)必須是V的父類,第二個(gè)參數(shù)必須繼承T,也就是T的子類。

源碼解析

1.apply

講完了上面這些就可以開始研究源碼了。

首先我們已經(jīng)知道了Function是一個(gè)泛型類,其中定義了兩個(gè)泛型參數(shù)T和R,在Function中,T代表輸入?yún)?shù),R代表返回的結(jié)果。也許你很好奇,為什么跟別的java源碼不一樣,F(xiàn)unction 的源碼中并沒有具體的邏輯呢?

其實(shí)這很容易理解,F(xiàn)unction 就是一個(gè)函數(shù),其作用類似于數(shù)學(xué)中函數(shù)的定義 ,(x,y)跟的作用幾乎一致。

Java8的Function怎么使用


所以Function中沒有具體的操作,具體的操作需要我們?nèi)樗付?,因此apply具體返回的結(jié)果取決于傳入的lambda表達(dá)式。

 R apply(T t);

舉個(gè)例子:

public void test(){
    Function test=i->i+1;
    test.apply(5);
}
/** print:6*/

我們用lambda表達(dá)式定義了一個(gè)行為使得i自增1,我們使用參數(shù)5執(zhí)行apply,最后返回6。這跟我們以前看待Java的眼光已經(jīng)不同了,在函數(shù)式編程之前我們定義一組操作首先想到的是定義一個(gè)方法,然后指定傳入?yún)?shù),返回我們需要的結(jié)果。函數(shù)式編程的思想是先不去考慮具體的行為,而是先去考慮參數(shù),具體的方法我們可以后續(xù)再設(shè)置。

再舉個(gè)例子:

public void test(){
    Function test1=i->i+1;
    Function test2=i->i*i;
    System.out.println(calculate(test1,5));
    System.out.println(calculate(test2,5));
}
public static Integer calculate(Function test,Integer number){
    return test.apply(number);
}
/** print:6 */
/** print:25 */

我們通過傳入不同的Function,實(shí)現(xiàn)了在同一個(gè)方法中實(shí)現(xiàn)不同的操作。在實(shí)際開發(fā)中這樣可以大大減少很多重復(fù)的代碼,比如我在實(shí)際項(xiàng)目中有個(gè)新增用戶的功能,但是用戶分為VIP和普通用戶,且有兩種不同的新增邏輯。那么此時(shí)我們就可以先寫兩種不同的邏輯。除此之外,這樣還讓邏輯與數(shù)據(jù)分離開來,我們可以實(shí)現(xiàn)邏輯的復(fù)用。

當(dāng)然實(shí)際開發(fā)中的邏輯可能很復(fù)雜,比如兩個(gè)方法F1,F2都需要操作AB,但是F1需要A->B,F(xiàn)2方法需要B->A。這樣的我們用剛才的方法也可以實(shí)現(xiàn),源碼如下:

public void test(){
    Function A=i->i+1;
    Function B=i->i*i;
    System.out.println("F1:"+B.apply(A.apply(5)));
    System.out.println("F2:"+A.apply(B.apply(5)));
}
/** F1:36 */
/** F2:26 */

也很簡單呢,但是這還不夠復(fù)雜,假如我們F1,F2需要四個(gè)邏輯ABCD,那我們還這樣寫就會(huì)變得很麻煩了。

2.compose和andThen

compose和andThen可以解決我們的問題。先看compose的源碼

  default  Function compose(Function before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

compose接收一個(gè)Function參數(shù),返回時(shí)先用傳入的邏輯執(zhí)行apply,然后使用當(dāng)前Function的apply。

default  Function andThen(Function after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

andThen跟compose正相反,先執(zhí)行當(dāng)前的邏輯,再執(zhí)行傳入的邏輯。

這樣說可能不夠直觀,我可以換個(gè)說法給你看看

compose等價(jià)于B.apply(A.apply(5)),而andThen等價(jià)于A.apply(B.apply(5))。

public void test(){
    Function A=i->i+1;
    Function B=i->i*i;
    System.out.println("F1:"+B.apply(A.apply(5)));
    System.out.println("F1:"+B.compose(A).apply(5));
    System.out.println("F2:"+A.apply(B.apply(5)));
    System.out.println("F2:"+B.andThen(A).apply(5));
}
/** F1:36 */
/** F1:36 */
/** F2:26 */
/** F2:26 */

我們可以看到上述兩個(gè)方法的返回值都是一個(gè)Function,這樣我們就可以使用建造者模式的操作來使用。

B.compose(A).cpmpose(A).andThen(A).apply(5);

這個(gè)操作很簡單,你可以自己試試。

“Java8的Function怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


文章標(biāo)題:Java8的Function怎么使用
網(wǎng)頁URL:http://weahome.cn/article/iihiij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部