📜  Java HashMap merge()

📅  最后修改于: 2020-09-27 00:44:29             🧑  作者: Mango

如果指定的键已经不存在,则Java HashMap merge()方法会将指定的键/值映射插入到哈希图中。

如果指定的键已经与一个值相关联,则该方法将旧的值替换为指定函数的结果。

merge()方法的语法为:

hashmap.merge(key, value, remappingFunction)

在这里, hashmapHashMap类的对象。


merge()参数

merge()方法采用3个参数:

  • key-与指定关联的键
  • value-要与key关联的值(如果key已经与任何值关联)
  • remappingFunction-关联的结果(如果已经与值关联)

merge()返回值
  • 返回与关联的新值
  • 如果没有与关联的null则返回null

注意 :如果remappingFunction结果为null ,则将删除指定的映射。


示例1:HashMap merge()插入新条目
import java.util.HashMap;

class Main {
  public static void main(String[] args) {
    // create an HashMap
    HashMap prices = new HashMap<>();

    // insert entries to the HashMap
    prices.put("Shoes", 200);
    prices.put("Bag", 300);
    prices.put("Pant", 150);
    System.out.println("HashMap: " + prices);

    int returnedValue = prices.merge("Shirt", 100, (oldValue, newValue) -> oldValue + newValue);
    System.out.println("Price of Shirt: " + returnedValue);

    // print updated HashMap
    System.out.println("Updated HashMap: " + prices);
  }
}

输出

HashMap: {Pant=150, Bag=300, Shoes=200}
Price of Shirt: 100
Updated HashMap: {Pant=150, Shirt=100, Bag=300, Shoes=200}

在上面的示例中,我们创建了一个名为price的哈希表。注意表达式

prices.merge("Shirt", 100, (oldValue, newValue) -> oldValue + newValue)

在这里,我们使用了lambda表达式(oldValue, newValue) -> oldValue + newValue)作为重新映射函数。要了解有关lambda表达式的更多信息,请访问Java Lambda Expressions。

由于密钥Shirt不在价格中 ,因此merge()方法将插入映射Shirt=100 。并且,重新映射函数的结果将被忽略。


示例2:HashMap merge()插入具有重复键的条目
import java.util.HashMap;

class Main {
  public static void main(String[] args) {
    // create an HashMap
    HashMap countries = new HashMap<>();

    // insert entries to the HashMap
    countries.put("Washington", "America");
    countries.put("Canberra", "Australia");
    countries.put("Madrid", "Spain");
    System.out.println("HashMap: " + countries);

    // merge mapping for key Washington
    String returnedValue = countries.merge("Washington", "USA", (oldValue, newValue) -> oldValue + "/" + newValue);
    System.out.println("Washington: " + returnedValue);

    // print updated HashMap
    System.out.println("Updated HashMap: " + countries);
  }
}

输出

HashMap: {Madrid=Spain, Canberra=Australia, Washington=America}
Washington: America/USA
Updated HashMap: {Madrid=Spain, Canberra=Australia, Washington=America/USA}, 

在上面的例子中,我们创建了一个名为HashMap的国家 。注意表达式

countries.merge("Washington", "USA", (oldValue, newValue) -> oldValue + "/" + newValue)

在这里,我们使用了lambda表达式(oldValue, newValue) -> oldValue + "/" + newValue)作为重新映射函数。

由于关键华盛顿已经存在于各个国家中 ,因此旧值被重映射函数返回的值所代替。因此, 华盛顿的映射包括价值America / USA


示例3:HashMap merge()合并两个HashMap
import java.util.HashMap;

class Main {
  public static void main(String[] args) {
    // create an HashMap
    HashMap prices1 = new HashMap<>();

    // insert entries to the HashMap
    prices1.put("Pant", 230);
    prices1.put("Shoes", 350);
    System.out.println("HashMap 1: " + prices1);

    // create another hashmap
    HashMap prices2 = new HashMap<>();

    //insert entries to the HashMap
    prices2.put("Shirt", 150);
    prices2.put("Shoes", 320);
    System.out.println("HashMap 2: " + prices2);

    // forEach() access each entries of prices2
    // merge() inserts each entry from prices2 to prices1
    prices2.forEach((key, value) -> prices1.merge(key, value, (oldValue, newValue) -> {
      
      // return the smaller value
      if (oldValue < newValue) {
        return oldValue;
      }
      else {
        return newValue;
      }
    }));

    System.out.println("Merged HashMap: " + prices1);
  }
}

输出

HashMap 1: {Pant=230, Shoes=350}
HashMap 2: {Shirt=150, Shoes=320}
Merged HashMap: {Pant=230, Shirt=150, Shoes=320}

在上面的示例中,我们创建了两个名为prices1prices2的哈希图 。注意代码,

prices2.forEach((key, value) -> prices1.merge(key, value, (oldValue, newValue) -> {
      if (oldValue < newValue) {
        return oldValue;
      }
      else {
        return newValue;
      }
    }));

在这里,HashMap forEach()方法访问哈希表price2的每个条目,并将其合并到哈希表price1中 。我们使用了两个lambda表达式:

  • (键,值)-> prices.merge(…) -它访问prices1的每个条目,并将其传递给merge()方法。
  • (oldValue,newValue)-> {…} -这是一个重新映射函数。它比较两个值并返回较小的值。

由于密钥“ 鞋子”同时存在于两个哈希图中,因此“ 鞋子”的值将被重新映射函数的结果替换。


Java HashMap merge()与。 putAll

我们还可以使用putAll()方法合并两个哈希图。但是,如果两个哈希图中都存在键,则将旧值替换为新值。

merge()不同, putAll()方法不提供重新映射函数。因此,我们无法决定要为重复键存储什么值。

要了解有关putAll()方法的更多信息,请访问Java HashMap putAll()。