java8 groupingby_Java8stream中利用groupingBy进行多字段分组求和

java8 groupingby_Java8stream中利用groupingBy进行多字段分组求和对集合按照单个属性分组、分组计数、排序Listitems=Arrays.asList(“apple”,”apple”,”banana”,”apple”,”orange”,”banana”,”papaya”);//分组Map>result1=items.stream().collect(Collectors.groupingBy(Function.identity()));…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

对集合按照单个属性分组、分组计数、排序

List items =

Arrays.asList(“apple”, “apple”, “banana”,

“apple”, “orange”, “banana”,

“papaya”);

// 分组

Map> result1 = items.stream().collect(

Collectors.groupingBy(

Function.identity()

)

);

//{papaya=[papaya], orange=[orange], banana=[banana, banana],

apple=[apple, apple, apple]}

System.out.println(result1);

// 分组计数

Map result2 = items.stream().collect(

Collectors.groupingBy(

Function.identity(),

Collectors.counting()

)

);

// {papaya=1, orange=1, banana=2, apple=3}

System.out.println(result2);

Map finalMap = new LinkedHashMap<>();

//分组, 计数和排序

result2.entrySet().stream()

.sorted(Map.Entry.comparingByValue().reversed())

.forEachOrdered(e -> finalMap.put(e.getKey(),

e.getValue()));

// {apple=3, banana=2, papaya=1, orange=1}

System.out.println(finalMap);

集合按照多个属性分组

1.多个属性拼接出一个组合属性

public static void main(String[] args) {

User user1 = new

User(“zhangsan”, “beijing”, 10);

User user2 = new

User(“zhangsan”, “beijing”, 20);

User user3 = new

User(“lisi”, “shanghai”, 30);

List list = new

ArrayList();

list.add(user1);

list.add(user2);

list.add(user3);

Map> collect =

list.stream().collect(Collectors.groupingBy(e ->

fetchGroupKey(e)));

//{zhangsan#beijing=[User{age=10, name=’zhangsan’,

address=’beijing’}, User{age=20, name=’zhangsan’,

address=’beijing’}],

//

lisi#shanghai=[User{age=30, name=’lisi’,

address=’shanghai’}]}

System.out.println(collect);

}

private static String fetchGroupKey(User user){

return user.getName()

+”#”+ user.getAddress();

}

2.嵌套调用groupBy

User user1 = new User(“zhangsan”, “beijing”, 10);

User user2 = new User(“zhangsan”, “beijing”, 20);

User user3 = new User(“lisi”, “shanghai”, 30);

List list = new ArrayList();

list.add(user1);

list.add(user2);

list.add(user3);

Map>> collect

= list.stream().collect(

Collectors.groupingBy(

User::getAddress, Collectors.groupingBy(User::getName)

)

);

System.out.println(collect);

3. 使用Arrays.asList

我有一个与Web访问记录相关的域对象列表。这些域对象可以扩展到数千个。

我没有资源或需求将它们以原始格式存储在数据库中,因此我希望预先计算聚合并将聚合的数据放在数据库中。

我需要聚合在5分钟窗口中传输的总字节数,如下面的sql查询

select

round(request_timestamp, ‘5’) as window,

–round timestamp to the nearest 5 minute

cdn,

isp,

http_result_code,

transaction_time,

sum(bytes_transferred)

from web_records

group by

round(request_timestamp,

‘5’),

cdn,

isp,

http_result_code,

transaction_time

在java 8中,我当前的第一次尝试是这样的,我知道这个解决方案类似于Group by multiple field

names in java 8

Map>>>>>> aggregatedData =

webRecords

.stream()

.collect(Collectors.groupingBy(WebRecord::getFiveMinuteWindow,

Collectors.groupingBy(WebRecord::getCdn,

Collectors.groupingBy(WebRecord::getIsp,

Collectors.groupingBy(WebRecord::getResultCode,

Collectors.groupingBy(WebRecord::getTxnTime,

Collectors.reducing(0,

WebRecord::getReqBytes(),

Integer::sum)))))));

这是可行的,但它是丑陋的,所有这些嵌套的地图是一个噩梦!要将地图“展平”或“展开”成行,我必须这样做

for (Date window : aggregatedData.keySet()) {

for (String cdn :

aggregatedData.get(window).keySet()) {

for (String isp :

aggregatedData.get(window).get(cdn).keySet()) {

for

(String resultCode :

aggregatedData.get(window).get(cdn).get(isp).keySet()) {

for (String txnTime :

aggregatedData.get(window).get(cdn).get(isp).get(resultCode).keySet())

{

Integer

bytesTransferred =

aggregatedData.get(window).get(cdn).get(distId).get(isp).get(resultCode).get(txnTime);

AggregatedRow row = new AggregatedRow(window,

cdn, distId…

如你所见,这是相当混乱和难以维持。

有谁知道更好的方法吗?任何帮助都将不胜感激。

我想知道是否有更好的方法来展开嵌套的映射,或者是否有一个库允许您对集合进行分组。

最佳答案

您应该为地图创建自定义密钥。最简单的方法是使用Arrays.asList:

Function> keyExtractor = wr ->

Arrays.asList(wr.getFiveMinuteWindow(), wr.getCdn(),

wr.getIsp(),

wr.getResultCode(), wr.getTxnTime());

Map, Integer> aggregatedData =

webRecords.stream().collect(

Collectors.groupingBy(keyExtractor,

Collectors.summingInt(WebRecord::getReqBytes)));

在这种情况下,键是按固定顺序列出的5个元素。不是很面向对象,但很简单。或者,您可以定义自己的表示自定义键的类型,并创建适当的hashCode/equals实现。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/171385.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue组件 订单支付15分钟倒计时

    vue组件 订单支付15分钟倒计时//支付倒计时ComputetTime(data){letst=data.currentTime.replace(/\-/g,”/”),//当前服务器时间ct=data.formatCreateTime.replace(/\-/g,”/”);//创建订单时间letts=newDate(st).getTime…

    2022年5月30日
    126
  • 【运筹学】整数规划、分支定界法总结 ( 整数规划 | 分支定界法 | 整数规划问题 | 松弛问题 | 分支定界法 | 分支定界法概念 | 分支定界法步骤 ) ★★

    【运筹学】整数规划、分支定界法总结 ( 整数规划 | 分支定界法 | 整数规划问题 | 松弛问题 | 分支定界法 | 分支定界法概念 | 分支定界法步骤 ) ★★一、整数规划、1、整数规划概念、2、整数规划分类、二、整数规划示例、三、整数规划解决的核心问题、四、整数规划问题解的特征、五、整数规划问题与松弛问题示例、六、分支定界法、1、整数规划概念、2、分支定界法求解整数规划步骤、3、分支定界理论分析、七、分支过程示例、八、分支定界法求整数规划示例、1、分支定界法求整数规划示例、2、求整数规划的松弛问题及最优解、3、第一次分支操作、4、第二次分支操作、5、第三次分支操作、6、整数规划最优解

    2022年7月12日
    12
  • 微机原理考试试题及答案分析_微机原理及接口技术

    微机原理考试试题及答案分析_微机原理及接口技术微机原理与接口技术期末考试试题及答案微机原理与接口技术期末考试题库微机系统的硬件由哪几部分组成?答:三部分:微型计算机(微处理器,存储器,I/0接口,系统总线),外围设备,电源。什么是微机的总线,分为哪三组?答:是传递信息的一组公用导线。分三组:地址总线,数据总线,控制总线。8086/8088CPU的内部结构分为哪两大模块,各自的主要功能是什么?答:总线接口部件(BIU)功能:根据执行单元EU的…

    2022年9月1日
    2
  • 软件著作权申请文件_软件著作权专利申请

    软件著作权申请文件_软件著作权专利申请背景描述近日项目组需要为我们的两款产品登记软件著作权,本人刚好在大学时和导师申请过软件著作权,故由本人负责软件著作权的申请工作。材料一:用户操作手册or用户使用说明书or用户设计说明书三种文档仍选其一即可,有操作界面的提交使用说明书,没有操作界面的提交设计说明书对于文档的格式要求如下:1.应提交前、后各连续30页,不足60页的,应当全部提交,我们的说明文档一般是不…

    2022年9月22日
    0
  • 秒杀多线程第四篇 一个经典的多线程同步问题

    秒杀多线程第四篇 一个经典的多线程同步问题

    2021年12月2日
    38
  • centos 7关闭selinux

    centos7关闭selinux查看SELinux状态:getenforce临时设置SeLinux:setenforce0永久修改Selinux为disabled:[root@localhost~]#cat/etc/selinux/config#ThisfilecontrolsthestateofSELinuxonthesystem.#SEL…

    2022年4月7日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号