java7&java8针对集合中对象的某一个字段分组

朱贵
• 阅读 1516

原文

java 8

java8用起来比较方便
根据普通单个字段

//假设传入一个非空订单集合
List<BaseOrder> orderList;

//想要按照订单号分组
Map<String, List<BaseOrder>> collect = orderList.stream()
        .collect(Collectors.groupingBy(t -> t.getTradeNo()));

根据多个字段

//假设传入一个非空订单集合,想要根据订单号和userId进行分组
@Data
@AllArgsConstructor
@EqualsAndHashCode
class UserTrade{
    private String userId;
    private String tradeNo
}

List<BaseOrder> orderList;
//分组
Map<UserTrade, List<BaseOrder>> collect = orderList.stream().
        collect(Collectors.groupingBy(new Function<BaseOrder, UserTrade>() {
          @Override
          public UserTrade apply(BaseOrder baseOrder) {
            return new UserTrade(baseOrder.getUserId(), baseOrder.getTradeNo());
          }
        }));

java7

核心:核心用到的是guava的LinkedListMultimap类.此类可以针对单个key,放多个value,这些value会组成一个list

//假设传入一个非空订单集合,想要根据订单号和userId进行分组
@Data
@AllArgsConstructor
@EqualsAndHashCode
class UserTrade{
    private String userId;
    private String tradeNo
}

//分组
List<BaseOrder> orderList;
LinkedListMultimap<UserTrade, BaseOrder> multimap = LinkedListMultimap.create();
for(BaseOrder baseOrder:orderList){
    multimap.put(new UserTrade(baseOrder.getUserId(),baseOrder.getTradeNo()),baseOrder);
}
List<BaseOrder> orders = multimap.get(new UserTrade("123","123"))

以上是基于java8和java7的两种不同的分组方式

作者:H_Man
链接:https://www.jianshu.com/p/932...
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Easter79 Easter79
4年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
4年前
ELK学习笔记之配置logstash消费kafka多个topic并分别生成索引
0x00 filebeat配置多个topicfilebeat.prospectors:input_type:logencoding:GB2312fields_under_root:truefields:添加字段
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这