工作经常会遇到list转为map的情况,可能我们只需要某个字段的值转为map集合,在jdk8以前,我们更多地可能会用for循环的方式,然后put到map中去,有了jdk8之后,我们可以使用简单的一句话,就可以搞定
List<UserBean> userList = new ArrayList<>();
UserBean userBean = new UserBean("张三","热爱学习", 21);
userList.add(userBean);
userBean = new UserBean("张三2","热爱学习2", 25);
userList.add(userBean);
userBean = new UserBean("张三33","热爱学习3", 27);
userList.add(userBean);
userBean = new UserBean("张三4","热爱学习2", 26);
userList.add(userBean);
System.out.println(userList);
Map<String,Integer> map =
userList.stream().collect(Collectors.toMap(UserBean::getUserName, UserBean::getAge,
(key1,key2) ->key2));
System.out.println(map);
关键语句:Map<String,Integer> map = userList.stream().collect(Collectors.toMap(UserBean::getUserName, UserBean::getAge,(key1,key2) ->key2));解释
key值重复报错信息:
Exception in thread “main” java.lang.IllegalStateException: Duplicate key 21
at java.util.stream.Collectors.lambda$throwingMerger
0
(
U
n
k
n
o
w
n
S
o
u
r
c
e
)
a
t
j
a
v
a
.
u
t
i
l
.
H
a
s
h
M
a
p
.
m
e
r
g
e
(
U
n
k
n
o
w
n
S
o
u
r
c
e
)
a
t
j
a
v
a
.
u
t
i
l
.
s
t
r
e
a
m
.
C
o
l
l
e
c
t
o
r
s
.
l
a
m
b
d
a
0(Unknown Source) at java.util.HashMap.merge(Unknown Source) at java.util.stream.Collectors.lambda
0(UnknownSource)atjava.util.HashMap.merge(UnknownSource)atjava.util.stream.Collectors.lambdatoMap$58(Unknown Source)
at java.util.stream.ReduceOps
3
R
e
d
u
c
i
n
g
S
i
n
k
.
a
c
c
e
p
t
(
U
n
k
n
o
w
n
S
o
u
r
c
e
)
a
t
j
a
v
a
.
u
t
i
l
.
A
r
r
a
y
L
i
s
t
3ReducingSink.accept(Unknown Source) at java.util.ArrayList
3ReducingSink.accept(UnknownSource)atjava.util.ArrayListArrayListSpliterator.forEachRemaining(Unknown Source)
at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.util.stream.ReferencePipeline.collect(Unknown Source)
at test.LamdaTest.abc(LamdaTest.java:32)
at test.LamdaTest.main(LamdaTest.java:12)
指定返回的Map为哪种类型:
Map<String,Integer> map = userList.stream().collect(Collectors.toMap(UserBean::getUserName, UserBean::getAge,(key1,key2) ->key2, LinkedHashMap::new));
要注意的坑:value的值不能为null,否则会报错