ZetCode

Java HashMap merge

最后修改于 2025 年 5 月 31 日

本文演示了如何在 Java 的 HashMap 中使用 merge 方法来合并重复键的值。

merge 方法提供了一种强大的方式来处理 HashMap 中的键值组合。 当你需要

这是该方法的签名

V merge(K key, V value, BiFunction<V,V,V> remappingFunction)

merge 方法接受三个参数

remappingFunction 是一个 BiFunction,它接受两个参数:现有值和新值。 它返回将存储在映射中的组合值。 如果键不存在,merge 方法将添加带有新值的键。 如果键存在,它将应用 remappingFunction 来将现有值与新值组合。

统计单词

在本示例中,我们将使用 merge 方法来统计数组中单词的出现次数。 通过 merge 方法,我们可以在遍历数组时有效地更新每个单词的计数。 如果某个单词已存在于映射中,我们将使用 lambda 表达式将其当前计数与新计数合并。

如果该单词不存在,则将添加它,初始计数为 1。 这种方法消除了对键存在性的显式检查的需要,使代码更简洁。

Main.java
void main() {

    HashMap<String, Integer> wordCounts = new HashMap<>();
    
    String[] words = {"apple", "banana", "apple", "orange", "banana", "apple"};
    
    for (String word : words) {
        wordCounts.merge(word, 1, (oldValue, newValue) -> oldValue + newValue);
    }
    
    System.out.println(wordCounts);
}

当键已存在时,通过合并值来统计单词出现次数。

高级合并场景

在本节中,我们将探讨使用 merge 方法的更复杂场景,包括有条件更新和处理 null 值。

Main.java
void main() {

    HashMap<String, BigDecimal> productPrices = new HashMap<>();
    productPrices.put("Laptop", BigDecimal.valueOf(799.99));
    productPrices.put("Phone", BigDecimal.valueOf(699.99));

    // Only update if the new price is lower
    productPrices.merge("Laptop", BigDecimal.valueOf(599.99),
            (oldPrice, newPrice) -> newPrice.compareTo(oldPrice) < 0 ? newPrice : oldPrice);

    System.out.println(productPrices);
}

本示例演示了如何根据与现有值的比较有条件地更新值。 merge 方法允许您实现用于合并值的自定义逻辑,使其适用于各种用例。

Null 值

merge 方法有助于有效地更新值,但它不接受 null 作为重映射函数中的新值。 如果传递 null,将导致 NullPointerException

Main.java
void main(String[] args) {

    HashMap<String, Integer> scores = new HashMap<>();
    
    // Merging existing values
    scores.merge("Alice", 100, (oldScore, newScore) -> oldScore + newScore);
    
    // Ensure non-null values are provided
    scores.merge("Bob", 0, (oldScore, newScore) -> oldScore + newScore);

    System.out.println(scores);
}

合并值时,应避免传递 null 作为新值。 而是使用默认值(例如,数字为 0)初始化。 这确保了安全更新,而不会出现意外异常。

库存管理

在本示例中,我们将使用 merge 方法来管理库存系统。 通过 merge 方法,我们可以在新货物到达时有效地更新产品数量。

Main.java
record Product(String name, int quantity) {

}

void main() {

    HashMap<String, Product> inventory = new HashMap<>();

    inventory.merge("A100", new Product("Laptop", 5),
            (oldProduct, newProduct) -> new Product(oldProduct.name,
                    oldProduct.quantity + newProduct.quantity));

    inventory.merge("A100", new Product("Laptop", 3),
            (oldProduct, newProduct) -> new Product(oldProduct.name,
                    oldProduct.quantity + newProduct.quantity));

    System.out.println(inventory);
}

本示例演示了如何在库存系统中合并产品数量。 通过 merge 方法,您可以有效地将现有产品数量与新货物合并,从而确保正确更新总数量,而无需首先检查键是否存在。

来源

Java HashMap merge 文档

merge 方法提供了一种简洁、线程安全的方式来处理复杂的 HashMap 操作,并具有清晰、可读的代码。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程