溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java8保姆級lambda表達(dá)式源碼分析

發(fā)布時間:2023-03-25 10:57:31 來源:億速云 閱讀:88 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“java8保姆級lambda表達(dá)式源碼分析”,在日常操作中,相信很多人在java8保姆級lambda表達(dá)式源碼分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java8保姆級lambda表達(dá)式源碼分析”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

1.替代匿名內(nèi)部類

毫無疑問,lambda表達(dá)式用得最多的場合就是替代匿名內(nèi)部類,而實現(xiàn)Runnable接口是匿名內(nèi)部類的經(jīng)典例子。lambda表達(dá)式的功能相當(dāng)強大,用()->就可以代替整個匿名內(nèi)部類!請看代碼:

如果使用匿名內(nèi)部類:

    @Test
    public void oldRunable() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("The old runable now is using!");
            }
        }).start();
    }

而如果使用lambda表達(dá)式:

    @Test
    public void runable() {
        new Thread(() -> System.out.println("It's a lambda function!")).start();
    }

最后的輸出:

The old runable now is using!

It's a lambda function!

是不是強大到可怕?是不是簡單到可怕?是不是清晰明了重點突出到可怕?這就是lambda表達(dá)式的可怕之處,用極少的代碼完成了之前一個類做的事情!

2.使用lambda表達(dá)式對集合進(jìn)行迭代

Java的集合類是日常開發(fā)中經(jīng)常用到的,甚至說沒有哪個java代碼中沒有使用到集合類。。。而對集合類最常見的操作就是進(jìn)行迭代遍歷了。請看對比:

    @Test
    public void iterTest() {
        List<String> languages = Arrays.asList("java","scala","python");
        //before java8
        for(String each:languages) {
            System.out.println(each);
        }
        //after java8
        languages.forEach(x -> System.out.println(x));
        languages.forEach(System.out::println);
    }

如果熟悉scala的同學(xué),肯定對forEach不陌生。它可以迭代集合中所有的對象,并且將lambda表達(dá)式帶入其中。

languages.forEach(System.out::println);

這一行看起來有點像c++里面作用域解析的寫法,在這里也是可以的。

3.用lambda表達(dá)式實現(xiàn)map

一提到函數(shù)式編程,一提到lambda表達(dá)式,怎么能不提map。。。沒錯,java8肯定也是支持的。請看示例代碼:

    @Test
    public void mapTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));
    }

最后的輸出結(jié)果:

10.5

21.0

31.5

map函數(shù)可以說是函數(shù)式編程里最重要的一個方法了。map的作用是將一個對象變換為另外一個。在我們的例子中,就是通過map方法將cost增加了0,05倍的大小然后輸出。

4.用lambda表達(dá)式實現(xiàn)map與reduce

既然提到了map,又怎能不提到reduce。reduce與map一樣,也是函數(shù)式編程里最重要的幾個方法之一。。。map的作用是將一個對象變?yōu)榱硗庖粋€,而reduce實現(xiàn)的則是將所有值合并為一個,請看:

    @Test
    public void mapReduceTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        double allCost = cost.stream().map(x -> x+x*0.05).reduce((sum,x) -> sum + x).get();
        System.out.println(allCost);
    }

最終的結(jié)果為:

 63.0

如果我們用for循環(huán)來做這件事情:

    @Test
    public void sumTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        double sum = 0;
        for(double each:cost) {
            each += each * 0.05;
            sum += each;
        }
        System.out.println(sum);
    }

相信用map+reduce+lambda表達(dá)式的寫法高出不止一個level。

5.filter操作

filter也是我們經(jīng)常使用的一個操作。在操作集合的時候,經(jīng)常需要從原始的集合中過濾掉一部分元素。

    @Test
    public void filterTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0,40.0);
        List<Double> filteredCost = cost.stream().filter(x -> x > 25.0).collect(Collectors.toList());
        filteredCost.forEach(x -> System.out.println(x));

    }

最后的結(jié)果:

30.0

40.0

將java寫出了python或者scala的感覺有沒有!是不是帥到爆!

6.與函數(shù)式接口Predicate配合

除了在語言層面支持函數(shù)式編程風(fēng)格,Java 8也添加了一個包,叫做 java.util.function。它包含了很多類,用來支持Java的函數(shù)式編程。其中一個便是Predicate,使用 java.util.function.Predicate 函數(shù)式接口以及l(fā)ambda表達(dá)式,可以向API方法添加邏輯,用更少的代碼支持更多的動態(tài)行為。Predicate接口非常適用于做過濾。

    public static void filterTest(List<String> languages, Predicate<String> condition) {
        languages.stream().filter(x -> condition.test(x)).forEach(x -> System.out.println(x + " "));
    }

    public static void main(String[] args) {
        List<String> languages = Arrays.asList("Java","Python","scala","Shell","R");
        System.out.println("Language starts with J: ");
        filterTest(languages,x -> x.startsWith("J"));
        System.out.println("\nLanguage ends with a: ");
        filterTest(languages,x -> x.endsWith("a"));
        System.out.println("\nAll languages: ");
        filterTest(languages,x -> true);
        System.out.println("\nNo languages: ");
        filterTest(languages,x -> false);
        System.out.println("\nLanguage length bigger three: ");
        filterTest(languages,x -> x.length() > 4);
    }

最后的輸出結(jié)果:

Language starts with J: 
Java 

Language ends with a: 
Java 
scala 

All languages: 
Java 
Python 
scala 
Shell 

No languages: 

Language length bigger three: 
Python 
scala 
Shell 

可以看到,Stream API的過濾方法也接受一個Predicate,這意味著可以將我們定制的 filter() 方法替換成寫在里面的內(nèi)聯(lián)代碼,這也是lambda表達(dá)式的魔力。

到此,關(guān)于“java8保姆級lambda表達(dá)式源碼分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI