Java Lambda表达式的分组/分块,组合收集器

数据分块/分组
// partitioningBy接受一个流,并将其按boolean分成两部分
public Map<Boolean, List<Artist>> bandsAndSolo(Stream<Artist> artists) {
    return artists.collect(partitioningBy(artist -> artist.isSolo()));
}
// groupingBy类似SQL中的group by操作
public Map<Artist,List<Album>> albumsByArtist(Stream<Album> albums){
    return albums.collect(groupingBy(album->album.getMainMusician()));
}
// Collectors.joining收集流中的值,该方法可以方便地从一个流中得到一个字符串,允许用户提供分隔符(分隔元素)、前缀和后缀
String result = list.stream().collect(Collectors.joining(","));
组合收集器
// 计算每个艺术家的专辑数
public Map<Artist,Long> numberOfAlbums(Stream<Album> albums){
       return albums.collect(groupingBy(album -> album.getMainMusician(),counting()));
}

groupingBy先将元素分块,每块都与分类函数getMainMusician提供的键值相关联,然后使用下游的另一个收集器收集每块中的元素,最后将结果映射为一个Map。

// 计算每个艺术家的专辑名
public Map<Artist,List<String>> nameOfAlbums(Stream<Album> albums){
       return albums.collect(groupingBy(Album::getMainMusician,mapping(Album::getName,toList())));
}

下游收集器:两个例子中我们都用到了第二个收集器,用以收集最终结果的一个子集。收集器是生成最终结果的一剂配方,下游收集器则是生成部分结果的配方,主收集器中会用到下游收集器。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值