最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java8保姆級(jí)lambda表達(dá)式教程

 更新時(shí)間:2023年03月24日 16:09:57   作者:bitcarmanlee  
這篇文章主要介紹了Java8之后的Lambda表達(dá)式的用法,lambda表達(dá)式將大量替代匿名內(nèi)部類的使用,簡(jiǎn)化代碼的同時(shí),更突出了原來(lái)匿名內(nèi)部類中最重要的那部分包含真正邏輯的代碼,需要的朋友可以參考下

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

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

如果使用匿名內(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!

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

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

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

    @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é),肯定對(duì)forEach不陌生。它可以迭代集合中所有的對(duì)象,并且將lambda表達(dá)式帶入其中。

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

這一行看起來(lái)有點(diǎn)像c++里面作用域解析的寫法,在這里也是可以的。

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

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

    @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ù)可以說(shuō)是函數(shù)式編程里最重要的一個(gè)方法了。map的作用是將一個(gè)對(duì)象變換為另外一個(gè)。在我們的例子中,就是通過(guò)map方法將cost增加了0,05倍的大小然后輸出。

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

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

    @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)來(lái)做這件事情:

    @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á)式的寫法高出不止一個(gè)level。

5.filter操作

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

    @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的感覺(jué)有沒(méi)有!是不是帥到爆!

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

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

    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的過(guò)濾方法也接受一個(gè)Predicate,這意味著可以將我們定制的 filter() 方法替換成寫在里面的內(nèi)聯(lián)代碼,這也是lambda表達(dá)式的魔力!

到此這篇關(guān)于java8手把手教你學(xué)會(huì)寫lambda表達(dá)式的文章就介紹到這了,更多相關(guān)java8教你學(xué)會(huì)lambda表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java顯示當(dāng)前運(yùn)行時(shí)的參數(shù)(java運(yùn)行參數(shù))

    java顯示當(dāng)前運(yùn)行時(shí)的參數(shù)(java運(yùn)行參數(shù))

    這篇文章主要介紹了java顯示當(dāng)前運(yùn)行時(shí)參數(shù)的示例(java運(yùn)行參數(shù)),需要的朋友可以參考下
    2014-04-04
  • Java 簡(jiǎn)化正則表達(dá)式的使用

    Java 簡(jiǎn)化正則表達(dá)式的使用

    本篇文章主要介紹了Java 簡(jiǎn)化正則表達(dá)式使用的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • Java之一文詳解String字符串的用法

    Java之一文詳解String字符串的用法

    本文將給大家重點(diǎn)講解一下String的用法,因?yàn)檫@個(gè)太常用,也太??剂恕tring字符串的內(nèi)容是比較多的,需要初學(xué)者進(jìn)行專門的學(xué)習(xí),尤其是它的一些底層原理更需要我們來(lái)了解,需要的同學(xué)跟著小編一起學(xué)習(xí)吧
    2023-05-05
  • Java設(shè)計(jì)者模式簡(jiǎn)單工廠模式解析

    Java設(shè)計(jì)者模式簡(jiǎn)單工廠模式解析

    這篇文章主要介紹了Java設(shè)計(jì)者模式簡(jiǎn)單工廠模式解析,介紹了其簡(jiǎn)介,實(shí)例以及優(yōu)缺點(diǎn)分析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java?協(xié)程?Quasar詳解

    Java?協(xié)程?Quasar詳解

    這篇文章主要介紹了Java?協(xié)程?Quasar詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Java多線程CountDownLatch的實(shí)現(xiàn)

    Java多線程CountDownLatch的實(shí)現(xiàn)

    本文主要介紹了Java多線程CountDownLatch的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java批量修改文件名的實(shí)現(xiàn)方法

    java批量修改文件名的實(shí)現(xiàn)方法

    這篇文章主要介紹了 java批量修改文件名的實(shí)現(xiàn)方法的相關(guān)資料,實(shí)現(xiàn)批量修改文件下的所有文件的文件名,具有一定的參考價(jià)值,需要的朋友可以參考下
    2017-07-07
  • Java源碼刨析之ArrayDeque

    Java源碼刨析之ArrayDeque

    ArrayDeque是Deque接口的一個(gè)實(shí)現(xiàn),使用了可變數(shù)組,所以沒(méi)有容量上的限制。同時(shí),?ArrayDeque是線程不安全的,在沒(méi)有外部同步的情況下,不能再多線程環(huán)境下使用<BR>
    2022-07-07
  • 一文搞懂Java中對(duì)象池的實(shí)現(xiàn)

    一文搞懂Java中對(duì)象池的實(shí)現(xiàn)

    池化并不是什么新鮮的技術(shù),它更像一種軟件設(shè)計(jì)模式,主要功能是緩存一組已經(jīng)初始化的對(duì)象,以供隨時(shí)可以使用。本文將為大家詳細(xì)講講Java中對(duì)象池的實(shí)現(xiàn),需要的可以參考一下
    2022-07-07
  • Java基礎(chǔ)學(xué)習(xí)之實(shí)參和形參

    Java基礎(chǔ)學(xué)習(xí)之實(shí)參和形參

    這篇文章主要介紹了Java基礎(chǔ)學(xué)習(xí)之實(shí)參形參,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-05-05

最新評(píng)論

拜泉县| 新平| 彩票| 宜宾县| 沛县| 无锡市| 增城市| 怀安县| 永安市| 普兰县| 临高县| 石河子市| 自治县| 中宁县| 桑植县| 德江县| 黄龙县| 昌平区| 大名县| 桦甸市| 怀柔区| 隆回县| 望奎县| 静海县| 新源县| 陕西省| 柳林县| 胶南市| 朔州市| 华坪县| 湖口县| 綦江县| 库尔勒市| 舟山市| 轮台县| 新乡县| 阿拉善盟| 清新县| 嘉义县| 五指山市| 平山县|