高级集合——组合收集器

组合收集器

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 {

    /**逆向统计,根据值来统计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));
        /**使用完流之后就会关闭, 再使用就会报错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]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,508评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,704评论 25 709
  • 通过这篇文章你能知道的问题: 1.如何判断对象是活着还是死去? 2.在Java语言中,可作为GCRoots的对象有...
    beneke阅读 5,158评论 0 1
  • 文/骑马上岸的人 春 不绝于耳的叫卖声 支撑着人们 此起彼伏的欲望 而我 是这春天中 最无力的一声
    骑马上岸的人阅读 3,465评论 49 49
  • 商场鞋柜生意并不怎么好,风格也不受大众欢迎,守了几个月下来已经心有余力不足了,从一开始听不得顾客嫌弃自己的鞋到...
    燕二阅读 3,308评论 0 1