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

Java函數(shù)式編程(四):在集合中查找元素

 更新時間:2014年09月25日 12:01:01   作者:deepinmind  
這篇文章主要介紹了Java函數(shù)式編程(四):在集合中查找元素,本文是系列文章的第4篇,其它篇章請參閱相關(guān)文章,需要的朋友可以參考下

查找元素

現(xiàn)在我們對這個設(shè)計優(yōu)雅的轉(zhuǎn)化集合的方法已經(jīng)不陌生了,但它對查找元素卻也是無能為力。不過filter方法卻是為這個而生的。

我們現(xiàn)在要從一個名字列表中,取出那些以N開頭的名字。當(dāng)然可能一個也沒有,結(jié)果可能是個空集合。我們先用老方法實現(xiàn)一把。

復(fù)制代碼 代碼如下:

final List<String> startsWithN = new ArrayList<String>();
for(String name : friends) {
if(name.startsWith("N")) {
startsWithN.add(name);
}
}

這么簡單的事件,寫了這么多代碼,也夠啰嗦的了。我們先創(chuàng)建了一個變量,然后把它初始為一個空集合。然后遍歷原來的集合,查找那些以指定字母開頭的名字。如果找到,就插入到集合里。

我們用filter方法來重構(gòu)一下上面這段代碼,看看它的威力到底如何。

復(fù)制代碼 代碼如下:

final List<String> startsWithN =
friends.stream()
.filter(name -> name.startsWith("N"))
.collect(Collectors.toList());

filter方法接收一個返回布爾值的lambda表達(dá)式。如果表達(dá)式結(jié)果為true,運行上下文中的那個元素就會被添加到結(jié)果集中;如果不是,就跳過它。最終返回的是一個Steam,它里面只包含那些表達(dá)式返回true的元素。最后我們用一個collect方法把這個集合轉(zhuǎn)化成一個列表——在后面52頁的使用collect方法和Collecters類中,我們會對這個方法進(jìn)去更深入的探討。

我們來打印一下這個結(jié)果集中的元素:

復(fù)制代碼 代碼如下:

System.out.println(String.format("Found %d names", startsWithN.size()));

從輸出結(jié)果很明顯能看出來,這個方法把集合中匹配的元素全都找出來了。
復(fù)制代碼 代碼如下:

Found 2 names

filter方法和map方法一樣,也返回了一個迭代器,不過它們也就這點相同而已了。map返回的集合和輸入集合大小是一樣的,而filter返回的可不好說。它返回的集合的大小區(qū)間,從0一直到輸入集的元素個數(shù)。和map不一樣的是,filter返回的是輸入集的一個子集。

到現(xiàn)在為止,lambda表達(dá)式帶來的代碼簡潔性讓我們很滿意,不過如果不注意的話,代碼冗余的問題就開始慢慢滋長了。下面我們來討論下這個問題。

lambda表達(dá)式的重用

lambda表達(dá)式看起來很簡潔,實際上一不小心很容易就出現(xiàn)代碼冗余了。冗余會導(dǎo)致代碼質(zhì)量低下,難以維護;如果我們想做一個改動,得把好幾處相關(guān)的代碼都一起改掉才行。

避免冗余還可以幫忙我們提升性能。相關(guān)的代碼都集中在一個地方,這樣我們分析它的性能表現(xiàn),然后優(yōu)化這一處的代碼,很容易就能提升代碼的性能。

現(xiàn)在我們來看下為什么使用lambda表達(dá)式容易導(dǎo)致代碼冗余,同時考慮如何去避免它。

復(fù)制代碼 代碼如下:

final List<String> friends =
Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott");
final List<String> editors =
Arrays.asList("Brian", "Jackie", "John", "Mike");
final List<String> comrades =
Arrays.asList("Kate", "Ken", "Nick", "Paula", "Zach");
We want to filter out names that start with a certain letter.

我們希望過濾一下某個字母開頭的名字。先用filter方法簡單地實現(xiàn)一下。
復(fù)制代碼 代碼如下:

final long countFriendsStartN =
friends.stream()
.filter(name -> name.startsWith("N")).count();
final long countEditorsStartN =
editors.stream()
.filter(name -> name.startsWith("N")).count();
final long countComradesStartN =
comrades.stream()
.filter(name -> name.startsWith("N")).count();

lambda表達(dá)式讓代碼看起來很簡潔,不過它不知不覺的帶來了代碼的冗余。在上面這個例子中,如果想改一下lambda表達(dá)式,我們得改不止一處地方——這可不行。幸運的是,我們可以把lambda表達(dá)式賦值給變量,然后對它們進(jìn)行重用,就像使用對象一樣。

filter方法,lambda表達(dá)式的接收方,接收的是一個java.util.function.Predicate函數(shù)式接口的引用。在這里,Java編譯器又派上用場了,它用指定的lambda表達(dá)式生成了Predicate的test方法的一個實現(xiàn)?,F(xiàn)在我們可以更明確的讓Java編譯器去生成這個方法,而不是在參數(shù)定義的地方再生成。在上面例子中,我們可以明確的把lambda表達(dá)式存儲到一個Predicate類型的引用里面,然后再把這個引用傳遞給filter方法;這樣做很容易就避免了代碼冗余。

我們來重構(gòu)前面這段代碼,讓它符合DRY的原則吧。(Don't Repeat Yoursef——DRY——原則,可以參看The Pragmatic Programmer: From Journeyman to Master[HT00],一書)。

復(fù)制代碼 代碼如下:

final Predicate<String> startsWithN = name -> name.startsWith("N");
final long countFriendsStartN =
friends.stream()
.filter(startsWithN)
.count();
final long countEditorsStartN =
editors.stream()
.filter(startsWithN)
.count();
final long countComradesStartN =
comrades.stream()
.filter(startsWithN)
.count();

現(xiàn)在不用再重復(fù)寫那個lambda表達(dá)式了,我們只寫了一次,并把它存儲到了一個叫startsWithN的Predicate類型的引用里面。這后面的三個filter調(diào)用里,Java編譯器看到在Predicate偽裝下的lambda表達(dá)式,笑而不語,默默接收了。

這個新引入的變量為我們消除了代碼冗余。不過不幸的是,后面我們就會看到,敵人很快又回來報仇雪恨了,我們再看看有什么更厲害的武器能替我們消滅它們。

相關(guān)文章

  • Java遞歸方法實現(xiàn)山脈繪制

    Java遞歸方法實現(xiàn)山脈繪制

    這篇文章主要為大家詳細(xì)介紹了Java遞歸方法實現(xiàn)山脈繪制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Spring Boot 整合mybatis 使用多數(shù)據(jù)源的實現(xiàn)方法

    Spring Boot 整合mybatis 使用多數(shù)據(jù)源的實現(xiàn)方法

    這篇文章主要介紹了Spring Boot 整合mybatis 使用多數(shù)據(jù)源的實現(xiàn)方法,需要的朋友可以參考下
    2018-03-03
  • ZooKeeper入門教程一簡介與核心概念

    ZooKeeper入門教程一簡介與核心概念

    本文是ZooKeeper入門系列教程,涵蓋ZooKeeper核心內(nèi)容,通過實例和大量圖表,結(jié)合實戰(zhàn),幫助學(xué)習(xí)者理解和運用,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-01-01
  • Springboot PostMapping無法獲取數(shù)據(jù)問題及解決

    Springboot PostMapping無法獲取數(shù)據(jù)問題及解決

    這篇文章主要介紹了Springboot PostMapping無法獲取數(shù)據(jù)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 使用maven-assembly-plugin如何將system 依賴范圍的jar以class 方式打包進(jìn) jar包中

    使用maven-assembly-plugin如何將system 依賴范圍的jar以class 方式

    這篇文章主要介紹了使用maven-assembly-plugin如何將system 依賴范圍的jar以class 方式打包進(jìn) jar包中,本文給大家分享完美解決思路,結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 如何通過javacv實現(xiàn)圖片去水?。ǜ酱a)

    如何通過javacv實現(xiàn)圖片去水?。ǜ酱a)

    這篇文章主要介紹了如何通過javacv實現(xiàn)圖片去水?。ǜ酱a),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Mybatis Plus Wrapper查詢某幾列的方法實現(xiàn)

    Mybatis Plus Wrapper查詢某幾列的方法實現(xiàn)

    MybatisPlus中,使用Wrapper的select和notSelect方法可以精確控制查詢的字段,本文就來介紹一下Mybatis Plus Wrapper查詢某幾列的方法實現(xiàn),感興趣的可以了解一下
    2024-10-10
  • 如何解決LocalDateTime傳值JSON格式化問題

    如何解決LocalDateTime傳值JSON格式化問題

    這篇文章主要介紹了如何解決LocalDateTime傳值JSON格式化問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 深入理解Java中的克隆

    深入理解Java中的克隆

    想必大家對克隆都有耳聞,世界上第一只克隆羊多莉就是利用細(xì)胞核移植技術(shù)將哺乳動物的成年體細(xì)胞培育出新個體,甚為神奇。其實在Java中也存在克隆的概念,即實現(xiàn)對象的復(fù)制。本文將嘗試介紹一些關(guān)于Java中的克隆和一些深入的問題,希望可以幫助大家更好地了解克隆。
    2016-08-08
  • log4j的Appenders配置方法

    log4j的Appenders配置方法

    下面小編就為大家?guī)硪黄猯og4j的Appenders配置方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論

贺兰县| 南开区| 北碚区| 嘉峪关市| 三原县| 马龙县| 汉川市| 莱西市| 定兴县| 纳雍县| 金湖县| 双峰县| 潼关县| 怀柔区| 六枝特区| 深圳市| 扶余县| 包头市| 资源县| 洱源县| 新河县| 安福县| 射洪县| 苗栗市| 池州市| 平舆县| 新津县| 繁峙县| 安庆市| 荆门市| 淮滨县| 兴宁市| 景德镇市| 西平县| 嵊泗县| 赣州市| 资溪县| 河津市| 高雄市| 浪卡子县| 会宁县|