java 8 map的merge方法

本文详细解析了Java中Map的merge方法,介绍了其功能和使用场景。通过实例展示了如何使用merge方法合并键值对,特别是当键已存在时如何应用重映射函数。在示例代码中,展示了如何将两个对象的属性值合并到一个Map中,形成新的键值对。
default V merge(K key, V value,
            BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
        Objects.requireNonNull(remappingFunction);
        Objects.requireNonNull(value);
        V oldValue = get(key);
        V newValue = (oldValue == null) ? value :
                   remappingFunction.apply(oldValue, value);
        if(newValue == null) {
            remove(key);
        } else {
            put(key, newValue);
        }
        return newValue;
    }

 

 

刚开始自己碰见这个没看源码直接百度,没看到很清晰的例子,就自己写个博客吧。

如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。 否则,将关联值替换为给定重映射函数的结果,如果结果为null ,则将其null 。 当组合键的多个映射值时,该方法可能是有用的

 

public class KettleTest {
    private Integer id;
    private String msg;
    public static void main(String[] args) {
        Map<Integer,String> map =  new HashMap<>();
        map.put(1,"lll");
        KettleTest kettleTest = new KettleTest();
        kettleTest.setId(1);
        kettleTest.setMsg("hhhhh");
        KettleTest kettleTest2 = new KettleTest();
        kettleTest2.setId(2);
        kettleTest2.setMsg("yyyyy");
        System.out.println(map.toString());
//也就是源码的V newValue = (oldValue == null) ? value : remappingFunction.apply(oldValue,value);
//当存在相同的id则将value赋值为后面函数执行后的值,否则直接赋值为value
//map里面的id有kettleTest.getId(),这个时候我们将会保存“lll”+“,”+kettleTest.getMsg()
//在这里p2是kettleTest.getMsg(),p1是“lll”,就是map.get(kettleTest.getId())
        map.merge(kettleTest.getId(),kettleTest.getMsg(),(p1, p2) -> p1 + "," + p2);
        System.out.println(map.toString());
//map里面不存在id为kettleTest.getId(),我们进行保存操作即可
        map.merge(kettleTest2.getId(),kettleTest2.getMsg(),(p1, p2) -> p1 + "," + p2);
        System.out.println(map.toString());
    }
}

 

### 关于JavaMap合并的方法Java中,`HashMap` 是一种常用的实现 `Map` 接口的数据结构。为了合并两个 `Map` 对象,在较新的版本(特别是自 Java 8 起),可以利用更简洁的方式来进行操作。 对于简单的键值覆盖情况,可以直接使用 `putAll()` 方法来完成 Map 的合并工作[^1]: ```java import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> mapOne = new HashMap<>(); mapOne.put("one", 1); HashMap<String, Integer> mapTwo = new HashMap<>(); mapTwo.put("two", 2); // 使用 putAll 进行简单合并 mapOne.putAll(mapTwo); System.out.println(mapOne); // 输出: {one=1, two=2} } } ``` 然而当存在相同键的情况下,则可能需要更加精细地控制如何处理冲突。此时可采用 `merge()` 函数,它允许指定一个用于解决重复键问题的操作逻辑: ```java import java.util.HashMap; import java.util.function.BiFunction; public class Main { public static void main(String[] args) { BiFunction<Integer, Integer, Integer> remappingFunction = (v1, v2) -> v1 + v2; // 自定义合并规则 HashMap<String, Integer> mapA = new HashMap<>(); mapA.put("commonKey", 10); HashMap<String, Integer> mapB = new HashMap<>(); mapB.put("commonKey", 20); for (var entry : mapB.entrySet()) { mapA.merge(entry.getKey(), entry.getValue(), remappingFunction); } System.out.println(mapA.get("commonKey")); // 输出: 30 } } ``` 另外,在更高版本的 Java 中还可以借助流式 API 来简化多张表之间的并集运算过程。通过 Stream 和 Collectors 工具类能够轻松达成目的: ```java import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public class Main { public static void main(String[] args) { HashMap<String, Integer> mapC = new HashMap<>(Map.of("a", 1)); HashMap<String, Integer> mapD = new HashMap<>(Map.of("b", 2)); Map<String, Integer> mergedMaps = Stream.concat( mapC.entrySet().stream(), mapD.entrySet().stream()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1)); // 解决key冲突策略 System.out.println(mergedMaps); // 输出: {a=1, b=2} } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子鞋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值