第五章 高級集合類和收集器

5.1 方法引用

Lambda 表達式有一個常見的用法;Lanbda 表達式經常 調用參數。比如想得到藝術家的姓名,Lambda 表達式如下:

artist -> artist.getName()

這鐘用法如此普遍,因此java8 提供了一個簡寫語法,叫做 方法引用。用于重寫上面的lambda 表達式:

Artist::getName

標準語法為:ClassNam::methodName。這是一種和lambda 表達式等價的一種結構,在需要時才會調用。凡是使用lambda 表達式的地方,就可以使用方法引用

構造函數也有同樣的縮寫形式,例如創建一個Artist 對象:

Artist::new


5.2 元素順序

在一個有序集合中創建一個流時,流中的順序就按出現順序排列。比如List

如果集合本身就是無序的,由此生成的流也是無序的。比如HashSet

使用并行流時,forEach方法不能保證元素是按順序處理的,如果需要保證按順序處理,應該使用forEachOrdered 方法。


5.3 使用收集器


5.3.1 轉換成其他集合

可能會有這樣的情況,你希望使用一個特定的集合收集值,你可以指定該集合的類型。此時你可以使用toCollection 方法,它接受一個Supplier作為參數,來創建集合。例如:

stream.collect(Collectors.toCollection(TreeSet::new));


5.3.2 轉換成值

還可以利用收集器讓流生成一個值:

找出樂隊成員最多的樂隊:

public Optional<Artist> biggestGroup(Stream<Artist> artists){

? ? ? ? // return artists.max(Comparator.comparing(artist -> artist.getMembers().count()));

? ? ? ? return artists.collect(Collectors.maxBy(Comparator.comparing(artist -> ?

? ? ? ?artist.getMembers().count())));

}


找出一組專輯上曲目的平均數:

public double averageNumberOfTracks (List albums) {

?// ?return ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //albums.stream().mapToInt(album>album.getTrackList().size()).average().getAsDouble();

? ? ?return albums.stream().collect(Collectors.averagingInt(album->album.getTrackList().size()));

}

通過stream()方法讓集合生成流,然后通過collect 方法收集結果。


5.3.3 數據分塊

另一個常用的流操作是將其分成兩個集合。

partitioningBy() 方法使用一個Predicate對象判斷一個元素應該屬于哪個部分,并根據布爾值返回一個Map到列表。

public Map<boolean,List<Artist>> bandsAndSolo(){

? ? ? ? ? ?return artists.collect(Collectors.partitioningBy(artist->artist.isSolo())); ? ? ? ?

}


5.3.4 數據分組

數據分組是一種更自然的分割數據操作,與將數據分成true 和false不同,可以使用任意值對數據分組。

//使用主唱對專輯分組

public Map<Artist , List<Album>> albumsByArtist(Stream<Album> albums){

? ? ? ? ?return albums.collect(Collectors.groupingBy(Album::getMainMusician));?

}


5.3.5 字符串

使用Collectors.joining 收集流中的值,可以方便的從一個流中得到一個字符串,允許用戶提供分隔符,前綴和后綴。

String result = artists.stream().map(Artist::getName).collect(Collectors.joining("," , "[" ?,"]" ));


5.3.6 組合收集器

//使用收集器計算每個藝術家的專輯

public Map<Artist,Long> numberOfAlbums(Stream<Album> albums){

? ? return albums.collect(Collectors.groupingBy(Album::getMainMusician, Collectors.counting()));

}

groupingBy 先將元素分塊,每塊都與getMainMusician 提供的鍵值相關聯,然后使用下游收集器 收集每塊中的元素,最后將結果映射為一個Map。

//使用收集器求每個藝術家的專輯

public Map> nameOfAlbums(Streamalbums){

? ? ? ? return ?albums.collect (Collectors.groupingBy (Album::getMainMusician , Collectors.mapping (Album::getName, Collectors.toList())));

}


5.4 Map類的變化


原有的Map迭代方式:

Map <Artist,Integer> countOfAlbums = new HashMap<>();

for(Map.Entry<Artist,List<Album> entry: albumByArtist.entrySet()>){

? ? ? ? ?Artist artist = entry.getKey();

? ? ? ? ?List<Album> albums = entry.getVaue();

? ? ? ? ?countOfAlbums.put(artist,album.size());

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容