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教程。