Java –如何在HashMap中更新键的值
本文介绍了几种更新或增加HashMap中的键的值的方法。
目录
1.更新HashMap中的键值
2.在HashMap中增加键的值
3.Java8getOrDefault()
4.Java8计算和合并
4.1Java8合并示例
4.2Java8计算
5.Java8computeIfPresent
6.Java8computeIfAbsent和putIfAbsent
7.参考
如果键不存在,则该put方法将创建具有关联值的键;如果键存在,则put更新其值。
Mapmap = new HashMap<>(); map.put("a", 1); System.out.println(map.get("a")); // 1 map.put("a", 2); // 键“ a”存在,更新或替换值 System.out.println(map.get("a")); // 2个
输出
1 2
2.1我们可以使用以下get()+1方法更新或增加键的值。
Mapmap = new HashMap<>(); // 如果键不存在,则抛出NullPointerException map.put("count", map.get("count") + 1);
输出
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.Map.get(Object)" is null
2.2但是,如果键不存在,则上述方法将引发NullPointerException。固定的是使用containsKey()来确保键在更新键的值之前存在。
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { if (map.containsKey("count")) { map.put("count", map.get("count") + 1); } else { map.put("count", 1); } } System.out.println(map.get("count"));
输出
10
或像以下方法一样使用一根衬管。
map.put("count", map.containsKey("count") ? map.get("count") + 1 : 1);
在Java8中,我们可以用getOrDefault来为不存在的键提供默认值。
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { // if key "count" doesn't exist, default to 0 map.put("count", map.getOrDefault("count", 0) + 1); } System.out.println(map.get("count"));
输出
10
Java8还添加了compute()和merge()增强了Map接口。以下示例增加了HashMap中的键值。
对于merge(),第一个参数是Map的键,第二个参数是默认值,第三个参数是BiFunction接受两个参数并提供键输出的a。
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { // 如果键不存在,则默认为1 map.merge("count", 1, (v1, v2) -> v1 + v2); } System.out.println(map.get("count"));
输出
10
我们可以使用方法参考简化lambda。
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { map.merge("count", 1, Integer::sum); } System.out.println(map.get("count"));
这compute类似于merge;第一个参数是Map的键,第二个参数是BiFunction。
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { map.compute("count", (k, v) -> (v == null) ? 1 : v + 1); } System.out.println(map.get("count"));
输出
10
另一个Java8compute示例,它增加了键的值。
TestMap.java
package com.mkyong.basic; import java.util.HashMap; import java.util.Map; public class TestMap { public static void main(String[] args) { Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { //map.compute("count", (k, v) -> createDefault(k, v)); // 方法引用 map.compute("count", TestMap::createDefault); } System.out.println(map.get("count")); } private static Integer createDefault(String key, Integer value) { if (value == null) { return 1; } return value + 1; } }
输出
10
computeIfPresent是类似于compute但运行计算方法仅当键存在或存在。
5.1以下computeIfPresent示例将打印一个null。
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { // 键数不存在,请跳过x 10 map.computeIfPresent("count", (k,v) -> v + 1); } System.out.println(map.get("count"));
输出
null
5.2以下computeIfPresent示例将打印一个10。
Mapmap = new HashMap<>(); map.put("count", 0); for (int i = 0; i < 10; i++) { // 键存在,好的,运行这个 map.computeIfPresent("count", (k, v) -> v + 1); } System.out.println(map.get("count"));
输出
10
6.1computeIfAbsent与computeIfPresent相似,但是仅在不存在或不存在键的情况下才运行compute方法。
TestMap.java
package com.mkyong.basic; import java.util.HashMap; import java.util.Map; public class TestMap { public static void main(String[] args) { Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { // 如果键不存在,则仅运行一次,否则跳过此步骤。 map.computeIfAbsent("count", TestMap::createDefault); } System.out.println(map.get("count")); } private static Integer createDefault(String key) { System.out.println("正在创建默认值...。"); if ("count".equalsIgnoreCase(key)) { return 0; } else { return -1; } } }
输出
正在创建默认值...。 0
6.2以下示例用于computeIfAbsent提供键的默认值;computeIfPresent更新或增加键值。
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { map.computeIfAbsent("count", TestMap::createDefault); // 默认0 map.computeIfPresent("count", (k, v) -> v + 1); // 增加+1 } System.out.println(map.get("count"));
输出
正在创建默认值...。 10
6.3还有一个putIfAbsent仅当键不存在时才更新值。
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { //map.computeIfAbsent("count", TestMap::createDefault); map.putIfAbsent("count", 0); map.computeIfPresent("count", (k, v) -> v + 1); } System.out.println(map.get("count"));
区别在于computeIfAbsent使用一个函数更新值,putIfAbsent直接更新值。