java8合并两个Map

本文介绍了在Java8中合并两个Map的四种方法:1) 使用Map的merge()方法,通过提供自定义函数处理冲突;2) 利用Stream.concat合并两个Map;3) 使用Stream.of()创建流并合并;4) 直接使用Collector进行收集转换。每个方法都详细解释了其实现逻辑和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

合并两个Map

需求:如果两个Map有冲突则Value取第二个Map中的Value

例子准备

实体类

import lombok.*;
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    private Long id;
    private String name;
}

新建两个Map<String,Employee>

private static Map<String, Employee> map1 = new HashMap<>();
    private static Map<String, Employee> map2 = new HashMap<>();
    static {
        Employee employee1 = new Employee(1L, "Henry");
        map1.put(employee1.getName(), employee1);
        Employee employee2 = new Employee(22L, "Annie");
        map1.put(employee2.getName(), employee2);
        Employee employee3 = new Employee(8L, "John");
        map1.put(employee3.getName(), employee3);
        Employee employee4 = new Employee(2L, "George");
        map2.put(employee4.getName(), employee4);
        Employee employee5 = new Employee(3L, "Henry");
        map2.put(employee5.getName(), employee5);
    }

在java8之前我们合并

@Test
    public void fun0() {
        Map<String, Employee> map3 = new HashMap<>(map1);
        for (Map.Entry<String, Employee> entry : map2.entrySet()) {
            if (map3.containsKey(entry.getKey())) {
                 map3.put(entry.getKey(), new Employee(map3.get(entry.getKey()).getId(), entry.getValue().getName()));
            }else{
                map3.put(entry.getKey(), entry.getValue());
            }
        }
    }

java8之后

1.用map提供的merge()方法来合并

@Test
    public void fun1() {
        Map<String, Employee> map3 = new HashMap<>(map1);
        map2.forEach((key, value) -> map3.merge(key, value, (v1, v2) -> new Employee(v1.getId(),v2.getName())));
        map3.forEach((k,v)-> System.out.println(k+"=:"+v));
    }

merge方法有三个参数,第一个是要合并的Key,第二个是合并的Value,第三个是一个接收两个参数的函数,它的作用就如我们上面的对于重复的key处理的逻辑一样,你可以自定义,v1是map2中的值,v2是map3中重复的值。

2.用Stream.concat来合并

Stream.contcat接收两个值,顺序的将两个集合中的数据加入流中,然后再用收集器变成Map

 @Test
    public void fun2() {
        Stream<Map.Entry<String, Employee>> concat = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream());
        Map<String, Employee> collect = concat.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (value1, value2) -> new Employee(value1.getId(), value1.getName())));
        collect.forEach((k,v)-> System.out.println(k+"=:"+v));
    }

3.用Stream.of()创建流后合并

和contact不同的是stream.of可以初始化多个元素,然后用扁平化的处理成需要的流,然后用收集器来转为Map

@Test
    public void fun3() {
        Map<String, Employee> collect = Stream.of(map1, map2)
                .flatMap(x -> x.entrySet().stream())
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> new Employee(v1.getId(), v2.getName())));
        collect.forEach((k,v)-> System.out.println(k+"=:"+v));
    }

4.直接用Collector来收集

@Test
    public void fun4() {
        Map<String, Employee> map3 = map2.entrySet()
                .stream()
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue,
                        (v1, v2) -> new Employee(v1.getId(), v2.getName()),() -> new HashMap<>(map1)));
        map3.forEach((k,v)-> System.out.println(k+"=:"+v));

    }
### 如何在 Java合并两个 Map 的实现方法 在 Java 中,可以通过多种方式来合并两个 `Map` 对象。以下是几种常见的实现方法: #### 方法一:使用简单的遍历和 putAll() 通过传统的循环或者直接调用 `putAll()` 方法可以轻松完成两个 `Map` 的合并操作。 ```java import java.util.HashMap; import java.util.Map; public class MergeMapsExample { public static void main(String[] args) { Map<String, Integer> map1 = new HashMap<>(); map1.put("A", 1); map1.put("B", 2); Map<String, Integer> map2 = new HashMap<>(); map2.put("C", 3); map2.put("D", 4); // 使用 putAll() 合并 map1.putAll(map2); System.out.println("Merged Map: " + map1); } } ``` 此代码片段展示了如何利用 `putAll()` 将第二个 `Map` 的键值对加入第一个 `Map`[^2]。 #### 方法二:处理重复键的情况 (Java 8 及以上版本) 如果存在相同的键,则可以根据需求定义覆盖逻辑。例如,在 Java 8 或更高版本中,可以使用 `merge()` 方法自定义冲突解决策略。 ```java import java.util.HashMap; import java.util.Map; public class MergeWithMergeMethod { public static void main(String[] args) { Map<String, Integer> map1 = new HashMap<>(); map1.put("A", 10); map1.put("B", 20); Map<String, Integer> map2 = new HashMap<>(); map2.put("B", 30); // 存在相同 key 'B' map2.put("C", 40); for (var entry : map2.entrySet()) { map1.merge(entry.getKey(), entry.getValue(), (v1, v2) -> v1 + v2); } System.out.println("Merged with conflict resolution: " + map1); } } ``` 这里演示了当遇到重复键时,将对应的值相加作为最终结果的逻辑[^3]。 #### 方法三:Stream API 实现 (Java 8 及以上版本) 借助 Stream 和 Collectors 工具类也可以优雅地达成目标。 ```java import java.util.*; import java.util.stream.Collectors; public class MergeUsingStreams { public static void main(String[] args) { Map<Integer, String> map1 = new HashMap<>(); map1.put(1, "Apple"); map1.put(2, "Banana"); Map<Integer, String> map2 = new HashMap<>(); map2.put(2, "Blueberry"); // Key collision here. map2.put(3, "Cherry"); Map<Integer, String> mergedMap = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (existingValue, newValue) -> existingValue)); // Resolve conflicts by keeping the original value. System.out.println("Merged using Streams: " + mergedMap); } } ``` 这段程序说明了怎样运用流式计算把两份数据集合起来,并指定了一种针对潜在关键字碰撞情况下的解决方案——保留原始映射中的条目[^4]。 --- ### 总结 上述三种技术分别适用于不同场景下两张哈希表型态资料结构之间的融合工作。无论是基础功能还是高级特性支持方面都提供了灵活的选择方案给开发者依据实际项目需求选用最合适的办法去解决问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值