1 介绍

2 Collectors的groupingBy方法

使用Java 8 提供的Stream API 可以以声明式的方法来处理集合中的数据。静态工厂方法 Collectors.groupingBy()和Collectors.groupingByConcurrent()提供类似SQL语言中的‘GROUP BY’的功能。两个工厂方法用于根据某些属性对集合中的元素分组并将分组结果存储在Map(ConcurrentMap)中。

groupingBy方法的三个重载版本:

参数为分类函数

static Collector>> groupingBy(Function super T,? extends K> classifier)

参数为分类函数、Collector对象(执行reduce操作)

static Collector>

groupingBy(Function super T,? extends K> classifier, Collector super T,A,D> downstream)

参数为分类函数、Supplier对象(提供Map接口的实现,用于分类结果的存储)和Collector对象(执行reduce操作)

static > Collector

groupingBy(Function super T,? extends K> classifier,

Supplier mapFactory, Collector super T,A,D> downstream)

2.1 示例代码设置

文章类型

public enum ArticleType {

NEWS,

REVIEW,

GUIDE

}

文章,包括文章标题、作者、文章类型和文章获得的喜欢数。

public class Article {

String title;

String author;

ArticleType type;

int likes;

}

待处理的文章列表

List articles = Arrays.asList(...);

2.2 基于单属性分组

单属性分组只需要一个分类函数作为参数,分类函数会作用于流的所有元素,分类函数的返回值将作为分组结果的键。

基于作者姓名的分组如下:

Map> byAuthor = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor));

Map> byType = articles.stream()

.collect(Collectors.groupingBy(article -> article.getType()));

2.3 分组结果的键为复杂类型

分类函数不仅限于返回一个纯量或字符串,分类结果的键可以是任何类型,但是要求实现了必要的equals和hashcode方法。

基于作者姓名和文章类型的分组如下:

Map, List> complexKeMap = articles.stream()

.collect(Collectors.groupingBy(new Function>() {

@Override

public Tuple2 apply(Article article) {

return new Tuple2<>(article.getAuthor(), article.getType());

}

}));

2.4 修改分组结果的值类型

默认分组结果的值类型为List,可以通过提供第二个参数来修改返回的类型。返回Set类型的示例代码如下:

// modify the return type Map to Map

Map> authorSet = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.toSet()));

2.5 多条件分组

下面的例子,首先按照作业分组,然后对分组的结果再按照文章类型分组:

Map>> chainGroup = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.groupingBy(Article::getType)));

2.6 对分组结果执行Reduce操作

一般分组结果的值类型为List,可以根据需要对List执行Reduce操作,比如获取List中某个属性值最大最小值的元素。

计算作者文章的获得的喜欢数的平均值:

Map averageLike = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.averagingInt(Article::getLikes)));

计算作者文章得到的喜欢数的总和:

Map sumLike = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.summingInt(Article::getLikes)));

计算每位作者最受欢迎的文章:

Map> maxLikeByAuthor = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.maxBy(Comparator.comparingInt(Article::getLikes))));

System.out.println(maxLikeByAuthor);

计算每位作者最不受欢迎的文章:

Map> minLikeByAuthor = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.minBy(Comparator.comparingInt(Article::getLikes))));

2.7 获取分组结果的统计数据

Stream专门提供了计算分组结果统计值的接口,统计值包括:最大值、最小值、平均值、总数、总和五个指标。

Map summaryStatistics = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.summarizingInt(Article::getLikes)));

2.8 修改分组结果值的类型

Map modifyGroupType = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.mapping(Article::getTitle, joining("||"))));

System.out.println(modifyGroupType);

2.9 返回支持并发操作的Map

ConcurrentMap> concurrentGroup = articles.parallelStream()

.collect(Collectors.groupingByConcurrent(Article::getAuthor));

java stream group_Java8 Stream之group相关推荐

  1. Java 8 (5) Stream 流 - 收集数据

    在前面已经使用过collect终端操作了,主要是用来把Stream中的所有元素结合成一个List,在本章中,你会发现collect是一个归约操作,就像reduce一样可以接受各种做法作为参数,将流中的 ...

  2. 【Java】流(Stream)快速入门

    本文是面向Java初学者的流(Stream)学习指导教程.文章内容偏向怎么用,而弱化其诞生背景.流的概念.内部原理等说明解释性的语段. 主要内容: Optional 创建流 操作流 收集流 目录 什么 ...

  3. Java基础(十一) Stream I/O and Files

    Java基础(十一) Stream I/O and Files 1. 流的概念 程序的主要任务是操纵数据.在Java中,把一组有序的数据序列称为流. 依据操作的方向,能够把流分为输入流和输出流两种.程 ...

  4. 造成java.io.IOException: Stream Closed异常的代码

    造成java.io.IOException: Stream Closed异常的代码 参考文章: (1)造成java.io.IOException: Stream Closed异常的代码 (2)http ...

  5. JAVA另类_java stream的几种另类用法

    除了用于简化对List, Set, Map等集合类型的操作外,java stream其实还可以抽象很多其他数据类型,然后在这一抽象的基础上做一些非常规操作.这些另类操作用好了,有时可以极大简化你的代码 ...

  6. java 两个stream合并_Java Stream 流如何进行合并操作

    1. 前言 Java Stream Api 提供了很多有用的 Api 让我们很方便将集合或者多个同类型的元素转换为流进行操作.今天我们来看看如何合并 Stream 流. 2. Stream 流的合并 ...

  7. java 使用nullable_Java Stream ofNullable(T)用法及代码示例

    如果此流不为null,则ofNullable(T)方法将返回包含单个元素的顺序Stream,否则该方法将返回空Stream.它有助于处理空流和NullPointerException. 用法: sta ...

  8. Java基础学习总结(140)——Java8 Stream之Stream流创建的几种方式

    package com.zhy.demo.javase.stream;import java.util.ArrayList; import java.util.Arrays; import java. ...

  9. Java基础学习总结(139)——Java8 Stream之Stream接口入门简介

    我们很多同学都知道,我们Java8中新增了很多有用的新功能,如Stream流.Lambda表达式等.今天在这里对Java8 的Stream的使用做个梳理和总结.Java语言中集合是使用最多的API,几 ...

最新文章

  1. “东数西算”工程正式启动,全面解读来了!
  2. JDBC连接Oracle数据库的参数配置
  3. NEW WAVE年轻人品质旅游报告
  4. FastDfs之TrackerServer的详细配置介绍
  5. 英文怎么读_数学公式的英文读法
  6. 苹果Mac Final Cut Pro更新后,如何将视频分享到YouTube?
  7. 使用 IntelliJ IDEA 导入 Spark源码及编译 Spark 源代码
  8. 图像测试环境软件,Digimizer(图像测量分析软件)
  9. cve20190708补丁的kb名称_2019-6微软安全更新补丁KB4503269
  10. PDF怎么转换成CAD图纸?PDF转CAD教程
  11. 代价地图、局部规划器调参说明
  12. 《Openwrt开发》第四章:newifi3 实现内网穿透(n2n)
  13. socket 读、写字节流数据
  14. html鼠标放上虚化背景图片,如何将网页CSS背景图高斯模糊且全屏显示
  15. 「数据运营」理解DataOps运营
  16. python实现直播功能_Python实现直播推流效果
  17. 用有限差分和牛顿法解非线性微分方程(边值问题)-python
  18. ubuntu18.04安装英伟达驱动
  19. 一些基础电路和物理量在线换算公式
  20. Java中的对象是什么?

热门文章

  1. java c语言 for_Java能写C语言编译器吗
  2. 安卓第一行代码第3版pdf_SPECFEM2D用户手册——第3章 网格生成——3.1 如何使用SPECFEM2D...
  3. 博士仅用2周投中了篇论文,戏耍157家期刊,被Science报道!
  4. 数学的威力:一个方程提升中国卫星图像质量30%
  5. 1682亿背后丨一分钟看懂天猫双11
  6. 23种设计模式之迭代器模式
  7. hashmap另一种初始化
  8. OpenTSDB 开发指南之 Grafana 展示OpenTSDB监控数据
  9. 【阿里云EMR实战篇】以EMR测试集群版本为例,详解 Flink SQL Client 集成 Hive 使用步骤
  10. 网络架构优化--云企业网典型场景分析for客户