- List转Map<Object,Object>
Map<Long, UserPoJo> userIdMap = userList.stream().collect(Collectors.toMap(UserPoJo::getId, u -> u,(k1,k2)->k1));
Map<Long, String> userIdMap =
userList.stream()
.collect(Collectors.toMap(UserPoJo::getId, UserPoJo::getName, (k1, k2) -> k1));
- 编写一个测试List转Map的测试类。
package yooo.yun.com.test;
import yooo.yun.com.user.pojo.UserPoJo;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author WangJiao
* @since 2020/11/01
*/
public class TestMain {
public static void main(String[] args) {
List<UserPoJo> userList = new ArrayList();
UserPoJo user = UserPoJo.of();
user.setId(222L);
user.setName("aaa");
userList.add(user);
UserPoJo user2 = UserPoJo.of();
user2.setId(222L);
user2.setName("aaa");
userList.add(user2);
UserPoJo user3 = UserPoJo.of();
user3.setId(333L);
user3.setName("aaa");
userList.add(user3);
UserPoJo user4 = UserPoJo.of();
user4.setId(444L);
user4.setName("aaa");
userList.add(user4);
testListToMap(userList);
}
public static void testListToMap(List<UserPoJo> userList) {
// 将List转换为Map
Map<Long, UserPoJo> userIdMap =
userList.stream().collect(Collectors.toMap(UserPoJo::getId, u -> u));
System.out.println("userIdMap: " + userIdMap);
}
}
- 上面的List中有两个相同的对象,id 等于222的。
- 直接使用该方法是会报错的,原因是重复的键,Map中的键是唯一的,不能重复。
- map 中的key是id,value是对象。
Map<Long, UserPoJo> userIdMap = userList.stream().collect(Collectors.toMap(UserPoJo::getId, u -> u));
Exception in thread "main" java.lang.IllegalStateException: Duplicate key UserPoJo(id=222, tel=null, password=null, avatar=null, name=aaa, keyOutTime=null, status=null)
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 yooo.yun.com.test.TestMain.testListToMap(TestMain.java:44)
at yooo.yun.com.test.TestMain.main(TestMain.java:38)
- 如果业务中查询出的List中的数据有重复的对象,那么在转map时就需要注意了,应使用一下方法来转换,k1,k2代表有重复的键时只保留其中一个,这样就不会报错了。
Map<Long, UserPoJo> userIdMap = userList.stream().collect(Collectors.toMap(UserPoJo::getId, u -> u,(k1,k2)->k1));
- 输出结果为:
userIdMap: {
444=UserPoJo(id=444, tel=null, password=null, avatar=null, name=aaa, keyOutTime=null, status=null),
333=UserPoJo(id=333, tel=null, password=null, avatar=null, name=aaa, keyOutTime=null, status=null),
222=UserPoJo(id=222, tel=null, password=null, avatar=null, name=aaa, keyOutTime=null, status=null)}
Process finished with exit code 0
- Map中的key为ID,value为name时使用
Map<Long, String> userIdMap =
userList.stream()
.collect(Collectors.toMap(UserPoJo::getId, UserPoJo::getName, (k1, k2) -> k1));
-: 学到这里,你就get到了喔!

博客主要围绕Java中List转Map<Object,Object>展开。当List中有重复对象,直接转换会因键重复报错,因为Map键需唯一。业务中查询出的List有重复对象时,转Map要采用特定方法,保留重复键中的一个,避免报错。

2577

被折叠的 条评论
为什么被折叠?



