Java - Stream 分组操作 groupingBy

Stream

Java8 API新出的语法,以一种声明式的方式处理数据,类似于SQL,更直观,是对Java集合运算更高级的语法。

可以让处理集合数据更高效、更简洁、更直观,使代码一目了然。

Stream 其实可以看成工厂流水线工作,是把需要处理的数据集合看作一种流,在管道中传输,每个环节是依次完成,经过中间操作处理后,最后由最终操作得到处理后的结果;也有并行流。

分组 groupingBy

模拟数据,实际中可以是数据库、网络数据、本地文件数据等

学生基本信息:
Student(sid=11, name=张三, addr=四川, age=23, height=175)
Student(sid=12, name=李四, addr=四川, age=38, height=168)
Student(sid=13, name=嬴政, addr=北京, age=26, height=185)
Student(sid=14, name=荆轲, addr=湖南, age=17, height=164)
Student(sid=15, name=高渐离, addr=陕西, age=26, height=194)
Student(sid=16, name=盖聂, addr=云南, age=17, height=184)
Student(sid=17, name=刘邦, addr=北京, age=23, height=165)
Student(sid=18, name=王五, addr=四川, age=38, height=165)
Student(sid=19, name=王阳明, addr=四川, age=50, height=174)
分组求各个地方身高最高的学生

// 先分组,然后 求身高最大的 学生
System.out.println("求各个地方最高的人:");
Map<String, Optional<Student>> groupMaxHeightStudentMap = students.stream()
		.collect(Collectors.groupingBy(Student::getAddr, 
		Collectors.mapping(a->a, 
				Collectors.maxBy((a,b)->a.getHeight() - b.getHeight()))));

// 输出结果
groupMaxHeightStudentMap.forEach((k,v)->System.out.println(k + " : " + v.get()));

结果:

求各个地方最高的人:
陕西 : Student(sid=15, name=高渐离, addr=陕西, age=26, height=194)
四川 : Student(sid=11, name=张三, addr=四川, age=23, height=175)
湖南 : Student(sid=14, name=荆轲, addr=湖南, age=17, height=164)
云南 : Student(sid=16, name=盖聂, addr=云南, age=17, height=184)
北京 : Student(sid=13, name=嬴政, addr=北京, age=26, height=185)

刚开始写微信公众号,请多多关注,欢迎,多谢!
微信公众号:《Java学习积累》
微信公众号:Java学习积累

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java 8的Stream中,可以使用groupingBy方法进行多字段分组求和。首先,我们需要创建一个包含对象的集合,然后使用stream方法将其转换为流。接下来,我们可以使用groupingBy方法来指定多个字段作为分组条件。每个字段都可以通过lambda表达式来指定。最后,我们可以使用collect方法来收集结果。 示例代码如下: ``` List<Item> items = Arrays.asList( new Item("apple", "China"), new Item("apple", "USA"), new Item("banana", "China"), new Item("banana", "USA"), new Item("orange", "China"), new Item("orange", "USA") ); Map<String, Map<String, Long>> result = items.stream() .collect(Collectors.groupingBy(Item::getProductType, Collectors.groupingBy(Item::getCountry, Collectors.counting()))); System.out.println(result); ``` 在这个示例中,我们创建了一个包含产品类型和国家的Item对象集合。然后,我们使用stream方法将其转换为流。接下来,我们使用groupingBy方法指定了两个字段作为分组条件,即产品类型和国家。最后,我们使用collect方法来收集结果,并将结果存储在一个嵌套的Map中,其中外层的键是产品类型,内层的键是国家,值是对应的计数。 输出结果将会是一个嵌套的Map,其中外层的键是产品类型,内层的键是国家,值是对应的计数。 #### 引用[.reference_title] - *1* *3* [Java8 stream 中利用 groupingBy 进行多字段分组求和](https://blog.csdn.net/lizhengyu891231/article/details/108997080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Java8 stream 中利用 groupingBy 进行多字段分组](https://blog.csdn.net/weixin_39637363/article/details/113543899)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天涯共明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值