putAll(Map<? extends K,? extends V> m)
将指定map的所有映射复制到调用此方法map。
如map1.putAll(map2);
那么就是将map2的所有映射复制到map1中
示例
public static void main(String[] args) {
Map<Integer,String> map1=new HashMap();
Map<Integer,String> map2=new HashMap();
//两个map集合的key互不相同
map1.put(1,"11");
map1.put(2,"12");
map2.put(3,"23");
map2.put(4,"24");
map1.putAll(map2);
System.out.println("map1:");
for(Map.Entry<Integer,String> entry:map1.entrySet()){
System.out.println("key: "+entry.getKey()+" value: "+entry.getValue());
}
System.out.println("=================================");
Map<Integer,String> map3=new HashMap();
Map<Integer,String> map4=new HashMap();
//两个map集合存在重复的key
map3.put(1,"11");
map3.put(2,"12");
map3.put(3,"13");
map4.put(2,"22");
map4.put(3,"23");
map4.put(4,"24");
map3.putAll(map4);
System.out.println("map3:");
for(Map.Entry<Integer,String> entry:map3.entrySet()){
System.out.println("key: "+entry.getKey()+" value: "+entry.getValue());
}
}
运行结果:
map1:
key: 1 value: 11
key: 2 value: 12
key: 3 value: 23
key: 4 value: 24
=================================
map3:
key: 1 value: 11
key: 2 value: 22
key: 3 value: 23
key: 4 value: 24
从结果可以看出:
- 如果map1与map2的key均不相同,那么将map2的所有映射直接复制到map1中;
- 如果map1与map2存在相同的key,那么当map2合并到map1时,当key相同,则value替换为map2的value
List 转 Map(Collectors.toMap)
创建一个Student对象:
@Data
@AllArgsConstructor
class Student{
int id;
String name;
}
List转Map示例:
public static void main(String[] args) {
//需要转成Map的List集合
List<Student> list=new ArrayList();
list.add(new Student(001,"张三"));
list.add(new Student(002,"李四"));
list.add(new Student(003,"王五"));
//List转Map
Map<Integer,String> map=list.parallelStream().collect(Collectors.toMap(Student::getId,Student::getName));
System.out.println(map);
}
运行结果:
{1=张三, 2=李四, 3=王五}
这里是将id作为key,name作为value
如果想让Student对象自身作为value,可以如下:
public static void main(String[] args) {
//需要转成Map的List集合
List<Student> list=new ArrayList();
list.add(new Student(001,"张三"));
list.add(new Student(002,"李四"));
list.add(new Student(003,"王五"));
//List转Map,value为Student对象自身
Map<Integer,Student> map=list.parallelStream().collect(Collectors.toMap(Student::getId,student -> student));
System.out.println(map);
}
运行结果:
{1=Student(id=1, name=张三), 2=Student(id=2, name=李四), 3=Student(id=3, name=王五)}
由于List集合中,Student的id可能是会相同的,那么在转为Map集合时,如果不对相同的key进行处理,则会报错
public static void main(String[] args) {
//需要转成Map的List集合
List<Student> list=new ArrayList();
list.add(new Student(001,"张三"));
list.add(new Student(002,"李四"));
list.add(new Student(003,"王五"));
list.add(new Student(002,"钱六")); //出现了id相同
//List转Map
Map<Integer,String> map=list.parallelStream().collect(Collectors.toMap(Student::getId,Student::getName));
System.out.println(map);
}
运行报错:
Exception in thread "main" java.lang.IllegalStateException: java.lang.IllegalStateException: Duplicate key 李四
......
Caused by: java.lang.IllegalStateException: Duplicate key 李四
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
at java.util.HashMap.merge(HashMap.java:1253)
在转换数据Student(002,"钱六")
时,由于键相同,因此转换出错,这时候就需要使用到Collectors.toMap
的重载方法 Collector.toMap(keyMapper,valueMapper,mergeFunction)
mergeFunction
就是处理当key重复时,决定value的合并方式
将
Map<Integer,String> map=list.parallelStream().collect(Collectors.toMap(Student::getId,Student::getName));
修改为
Map<Integer,String> map=list.parallelStream().collect(Collectors.toMap(Student::getId,Student::getName,(value1,value2) -> value1));
运行结果:
{1=张三, 2=李四, 3=王五}
其中第三个参数(value1,value2) -> value1
表示当键相同时,取前者的值作为这个键的值
如果修改为(value1,value2) -> value2
,那么运行结果如下:
{1=张三, 2=钱六, 3=王五}