当前位置:网站首页>Collectors.toMap应用
Collectors.toMap应用
2022-06-30 09:56:00 【gqltt】
Collectors.toMap介绍
在真实的业务场景中有很多集合转map的操作,例如
@Data
public class House {
private Integer id; //id
private Integer ownerid; //家主编号
private String housename; //家庭名称
private String address; //家庭地址
}
模拟数据
/**
* @description: List 转 Map 操作
*/
public class ListToMap {
public static void main(String[] args) {
House house = new House(1,1,"aa","北京海淀");
House house1 = new House(2,2,"bb","湖北武汉");
House house2 = new House(3,3,"cc","浙江杭州");
ArrayList<House> houses = new ArrayList<>();
houses.add(house);
houses.add(house1);
houses.add(house2);
//在实际项目中我们经常会用到 List 转 Map 操作 ->过去是for循环的操作,现在可以学习如下的方法Collectors.toMap
/**
* 我们收集一下集合中每个对象的两个单独的属性
*/
Map<String, String> mapHouse = houses.stream().collect(Collectors.toMap(House::getHousename, House::getAddress));
System.out.println(mapHouse);
//{aa=湖北武汉, bb=浙江杭州, cc=北京海淀}
/**
* 前后的属性的数据类型要对应 一般时间业务中收集带有唯一表示的业务数据
*/
Map<Integer, String> map = houses.stream().collect(Collectors.toMap(House::getOwnerid, House::getHousename));
System.out.println(map);
//{1=aa, 2=bb, 3=cc}
/**
* 收集一下属性和对象本身
*/
Map<Integer, House> houseMap = houses.stream().collect(Collectors.toMap(House::getOwnerid, o -> o));
Map<Integer, House> houseMap1 = houses.stream().collect(Collectors.toMap(House::getOwnerid, Function.identity()));
System.out.println(houseMap);
/**
* {1=House{id=1, ownerid=1, housename='aa', address='北京海淀'},
* 2=House{id=2, ownerid=2, housename='bb', address='湖北武汉'},
* 3=House{id=3, ownerid=3, housename='cc', address='浙江杭州'}}
*/
//业务场景:一般会根据具体的键值 取具体的对象
System.out.println(houseMap.get(1));
//House{id=1, ownerid=1, housename='aa', address='北京海淀'}
//此处的效果同houseMap
System.out.println(houseMap1);
/**
* {1=House{id=1, ownerid=1, housename='aa', address='北京海淀'},
* 2=House{id=2, ownerid=2, housename='bb', address='湖北武汉'},
* 3=House{id=3, ownerid=3, housename='cc', address='浙江杭州'}}
*/
}
}
常见操作大家实践即可
houses.stream().collect(Collectors.toMap(House::getOwnerid, House::getHousename));
深入Collectors.toMap
Collectors.toMap 有三个重载方法:
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper);
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction);
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);
参数含义分别是:
keyMapper:Key 的映射函数
valueMapper:Value 的映射函数
mergeFunction:当 Key 冲突时,调用的合并方法
mapSupplier:Map 构造器,在需要返回特定的 Map 时使用
业务场景最多的还是map的键为一个唯一的标识符,值为对象本身!
如果希望得到 Map 的 value 为对象本身时,可以这样写
/**
* 收集一下属性和对象本身
*/
Map<Integer, House> houseMap =
houses.stream()
.collect(Collectors.toMap(House::getOwnerid, o -> o));
Map<Integer, House> houseMap1 =
houses.stream()
.collect(Collectors.toMap(House::getOwnerid, Function.identity()));
常见的java.lang.IllegalStateException: Duplicate key 问题处理
我们把做的测试数据 House house = new House(1,1,“aa”,“北京海淀”);
House house1 = new House(2,2,“bb”,“湖北武汉”);
House house2 = new House(3,3,“cc”,“浙江杭州”);
house2修改为: House house2 = new House(3,1,“cc”,“浙江杭州”);
这样Ownerid会重复
当我们执行如下代码时:houses.stream().collect(Collectors.toMap(House::getOwnerid, House::getHousename);
会出错,java.lang.IllegalStateException: Duplicate key
线上业务代码出现Duplicate Key的异常,影响了业务逻辑,查看抛出异常部分的代码
Exception in thread "main" java.lang.IllegalStateException: Duplicate key aa
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
at java.util.HashMap.merge(HashMap.java:1254)
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at com.example.cwgl.ListToMap.main(ListToMap.java:28)
解决办法:出现重复时,取前面value的值,或者取后面放入的value值,则覆盖先前的value值
houses.stream()
.collect(Collectors.toMap(House::getOwnerid, House::getHousename,(v1,v2)->v2));
houses.stream()
.collect(Collectors.toMap(House::getOwnerid, House::getHousename,(v1,v2)->v1));
对于结果的操作还有很多处理方法,如拼接等
houses.stream().collect(Collectors.toMap(House::getOwnerid, House::getHousename,(v1,v2)->v1+v2));
具体的实践根据具体的业务来操作数据即可
List统计重复数量
final String path = "F:/AppData/API-url.txt";
final List<String> list = BlockIOUtil.readLines("file:" + path);
Map<String, Integer> map =
list.stream().collect(Collectors.toMap(it -> it, it -> 1, (val1, val2) -> val1 + 1));
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() != null && entry.getValue() > 1) {
System.out.println(entry.getKey() + "-->" + entry.getValue());
}
}边栏推荐
- MySQL index, transaction and storage engine of database (2)
- CVPR 2022 | 清华&字节&京东提出BrT:用于视觉和点云3D目标检测的桥接Transformer
- Use keil5 software to simulate and debug gd32f305 from 0
- 逸仙电商发布一季报:坚持研发及品牌投入,实现可持续高质量发展
- South China Industrial Group launched digital economy and successfully held the city chain technology conference
- 潘多拉 IOT 开发板学习(HAL 库)—— 实验1 跑马灯(RGB)实验(学习笔记)
- & and - > priority
- Auto Seg-Loss: 自动损失函数设计
- Enter the world of helium (hNT) hotspot servers to bring you different benefits
- 吴恩达2022机器学习专项课测评来了!
猜你喜欢

GeoffreyHinton:我的五十年深度学习生涯与研究心法

ArcGIS Pro脚本工具(6)——修复CAD图层数据源

苹果5G芯片被曝研发失败,QQ密码bug引热议,蔚来回应做空传闻,今日更多大新闻在此...

Criu enables hot migration

吴恩达2022机器学习专项课测评来了!

How to seize the opportunity of NFT's "chaos"?

MySQL index, transaction and storage engine of database (1)

Robotframework learning notes: environment installation and robotframework browser plug-in installation

A brief introduction to database mysql

Kernel linked list (general linked list) "list.h" simple version and individual comments
随机推荐
CVPR 2022 | Tsinghua & bytek & JD put forward BRT: Bridging Transformer for vision and point cloud 3D target detection
Splendid China: public welfare tourism for the middle-aged and the elderly - entering Foshan nursing home
The digital collection of sunanmin's lotus heart clearing was launched on the Great Wall Digital Art
如何解决跨域
Gd32 RT thread RTC driver function
The rising star of Goldshell STC box
微信推出图片大爆炸功能;苹果自研 5G 芯片或已失败;微软解决导致 Edge 停止响应的 bug|极客头条...
TypeScript–es5中的类,继承,静态方法
六月集训(第30天) —— 拓扑排序
R语言aov函数进行重复测量方差分析(Repeated measures ANOVA、其中一个组内因素和一个组间因素)、分别使用interaction.plot函数和boxplot对交互作用进行可视化
mysql数据库基础:存储过程和函数
The performance of arm's new CPU has been improved by 22%, up to 12 cores can be combined, and the GPU is first equipped with hardware optical tracking. Netizen: the gap with apple is growing
技能梳理[email protected]基于51系列单片机的智能仪器教具
【Rust日报】2021-01-23 几个新库发布
打通供应链 深圳礼品展助跨境电商寻破局之道
Get through the supply chain Shenzhen gift show helps cross-border e-commerce find ways to break the situation
Gd32 RT thread flash driver function
技能梳理[email protected]语音模块+stm32+nfc
技能梳理[email protected]體感機械臂
GD32 RT-Thread RTC驱动函数