高級集合——組合收集器

組合收集器

1.代碼

package org.java8.collector;

import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

import org.java8.vo.Album;
import org.java8.vo.Artist;
import org.java8.vo.Track;

public class MultiCollector {

    /**逆向統(tǒng)計,根據(jù)值來統(tǒng)計key或者整個對象**/
    public static void main(String[] args) {
        Artist tinygao2 = new Artist("tinygao2", "zh");
        Artist tinygao1 = new Artist("tinygao1", "zh");
        
        Album album1 = new Album(
                                "album1", 
                                Arrays.asList(new Track("tinygao", 1)), 
                                Arrays.asList(
                                        tinygao2,
                                        tinygao1
                                ));
        
        Album album2= new Album(
                                "album2", 
                                Arrays.asList(new Track("tinygao", 1)), 
                                Arrays.asList(
                                        tinygao2,
                                        tinygao1
                                ));
        
        Album album3  = new Album(
                                "album3", 
                                Arrays.asList(new Track("tinygao", 1)), 
                                Arrays.asList(
                                        tinygao1
                                ));
        Stream<Album> albums1 = Stream.of(album1,album2,album3);
        Stream<Album> albums2 = Stream.of(album1,album2,album3);
        numberOfAlbums(albums1).forEach((x, y)->System.out.println(x+"->"+y));
        /**使用完流之后就會關(guān)閉, 再使用就會報錯stream has already been operated upon or closed**/
        nameOfAlbums(albums2).forEach((x, y)->System.out.println(x+"->"+y));
        
    }
    
    public static Map<Artist, Long> numberOfAlbums(Stream<Album> albums) {
        /**先獲取Artist function,然后在做reduce操作**/
        /** Map<Artist,List<Album>> 為下面的返回值
            albums.collect(groupingBy(album -> album.getMainMusician()));
        **/
        return albums.collect(groupingBy(album -> album.getMainMusician(),
                counting()));
    }
    
    public static Map<Artist, List<String>> nameOfAlbums(Stream<Album> albums) {
        /**Album::getName 在mapping中是對Map<Artist,List<Album>> 后者做mapping**/
        return albums.collect(groupingBy(Album::getMainMusician,
        mapping(Album::getName, toList())));
    }
}

2.輸出

tinygao1->1
tinygao2->2
tinygao1->[album3]
tinygao2->[album1, album2]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,908評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,223評論 25 708
  • 通過這篇文章你能知道的問題: 1.如何判斷對象是活著還是死去? 2.在Java語言中,可作為GCRoots的對象有...
    beneke閱讀 1,367評論 0 1
  • 文/騎馬上岸的人 春 不絕于耳的叫賣聲 支撐著人們 此起彼伏的欲望 而我 是這春天中 最無力的一聲
    騎馬上岸的人閱讀 525評論 49 49
  • 商場鞋柜生意并不怎么好,風格也不受大眾歡迎,守了幾個月下來已經(jīng)心有余力不足了,從一開始聽不得顧客嫌棄自己的鞋到...
    燕二閱讀 490評論 0 1