Java HashMap merge
最后修改于 2025 年 5 月 31 日
本文演示了如何在 Java 的 HashMap 中使用 merge 方法来合并重复键的值。
merge 方法提供了一种强大的方式来处理 HashMap 中的键值组合。 当你需要
- 合并现有键的值
- 有条件地添加新条目
- 实现自定义合并逻辑
- 安全地处理并发更新
这是该方法的签名
V merge(K key, V value, BiFunction<V,V,V> remappingFunction)
merge 方法接受三个参数
key:应该合并值的键。value:要与现有值合并的新值。remappingFunction:一个函数,用于定义如果键已存在,如何将现有值与新值组合。
remappingFunction 是一个 BiFunction,它接受两个参数:现有值和新值。 它返回将存储在映射中的组合值。 如果键不存在,merge 方法将添加带有新值的键。 如果键存在,它将应用 remappingFunction 来将现有值与新值组合。
统计单词
在本示例中,我们将使用 merge 方法来统计数组中单词的出现次数。 通过 merge 方法,我们可以在遍历数组时有效地更新每个单词的计数。 如果某个单词已存在于映射中,我们将使用 lambda 表达式将其当前计数与新计数合并。
如果该单词不存在,则将添加它,初始计数为 1。 这种方法消除了对键存在性的显式检查的需要,使代码更简洁。
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 值。
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。
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 方法,我们可以在新货物到达时有效地更新产品数量。
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 方法,您可以有效地将现有产品数量与新货物合并,从而确保正确更新总数量,而无需首先检查键是否存在。
来源
merge 方法提供了一种简洁、线程安全的方式来处理复杂的 HashMap 操作,并具有清晰、可读的代码。
作者
列出所有Java教程。