stream流—关于Collectors.toMap使用详解
目录
- 使用规则:
- 1.将list转成以id为key的map,value是id对应的某对象
- 2.假如id存在重复值,则会报错Duplicate key xxx
- 3.想获得一个id和name对应的Map<String, String>
- 3.1 name为空时null
- 3.2 id重复时
- 4.分组 使用groupingby
使用规则:
toMap(Function, Function) 返回一个 Collector,它将元素累积到一个 Map中,其键和值是将提供的映射函数应用于输入元素的结果。
如果映射的键包含重复项,则在执行收集操作时会抛出IllegalStateException。
1.将list转成以id为key的map,value是id对应的某对象
Map<String, Map<String, Object>> lineOffMap = tmlLineOffBySubIdList.stream().
collect(Collectors.toMap(map -> map.get("subs_id").toString(), value -> value));
解释:
将tmlLineOffBySubIdList转化为key=subs_id,value=subs_id的这条记录,也就是某个对象用
Map<String, Object>存储;
(这么做的目的就是最后我们要根据这个key也就是subs_id,去和主键为subs_id列表进行一个嵌套匹配)
举例
2.假如id存在重复值,则会报错Duplicate key xxx
处理方法:可以使用分组
3.想获得一个id和name对应的Map<String, String>
Map<String, String> map = list.stream().
collect(Collectors.toMap(Student.getId(),Student.getName()));
3.1 name为空时null
- name可以为空字符串但不能为null,否则会报空指针;
- 解决方案:使用三目运算符
Map<String, String> map = list.stream().
collect(Collectors.toMap(Student.getId(), e->e.getName()==null?"":e.getName()));
//这里的e也可以是其他字母 如 o -> o.getNmae() == null ? "" : e.getName()
3.2 id重复时
- 假如存在id重复,两个vaue可以这样映射到同一个id
Map<String, String> map = list.stream().
collect(Collectors.toMap(Student.getId(),Student.getName(),
(e1,e2)->e1+","+e2));
4.分组 使用groupingby
- 把Student集合按照班级分组到map中
Map<String,List<Student>> map= list.stream().
collect(Collectors.groupingby(Student.getClass()));
举例
- category货品,一个货品含有多个货物
- category_id货品id
- goods货物,一条货物记录也就是一个货物对象里面含有其上属的货品id
- 场景:查出货品列表;查出货物列表
- 目的:要根据货品把相应的货物匹配嵌套到货品的信息里面:像下面的样子
category_good_list[
{
category_id=1[
{
category_id=1
货物1
},
{
category_id=1
货物2
}
]
},
{
category_id=2[
{
category_id=2
货物3
},
{
category_id=2
货物4
}
]
},
timestamp:12873238123123
]
第一步:
Map<String, List<Map<String, Object>>> categoryIdMap =
orderOutCategoryGoodsList.stream().
collect(Collectors.groupingBy(map -> map.get("category_id").toString()));
//根据货物里面的category_id 进行分组;因为一个货品可能有多个货物;
分组结果如下:
第二步:
根据货品id,也就是category_id 和货品list进行匹配,因为已经分组了,所以货品id是唯一的;
for (Map<String, Object> tempCategoryMap : orderOutCategoryList) {
String categoryId = tempCategoryMap.get("category_id").toString();
tempCategoryMap.put("goodsList", categoryIdMap.get(categoryId));
categoryAndGoodsList.add(tempCategoryMap);
}
利用货品id把相应货物塞到货品列表里面,这样就可以得到,货品列表及其货品底下的货物列表(相当于树结构,枝干和它的孩子枝叶)
其他
List<Map<String, Object>> queryMapList = xxxService.queryMapList("statement", paraMap);
查到结果是list
meter_id
23080800000066
23080800000067
23080800000068
stream流的使用:
String meterId = queryMapList.stream().map(map -> map.get("meter_id").toString()).
collect(Collectors.joining(","));
分解介绍:queryMapList.stream()调用流
map(map -> map.get("meter_id")获取key也就是"meter_id"对应的每一个值
collect(Collectors.joining(","));最后要加上collect()这个一般是放在最后面使用的
Collectors.joining(",") 再利用"," 把每一个value拼接起来
最后就得到结果:String meterId ="23080800000066,23080800000067,23080800000068"
//要是还想得到 " meter_id" 为key "23080800000066,23080800000067,23080800000068"
为value的形式
就再new一个map即可:如下
Map<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put("meter_id", meterId);