Java HashMap compute()方法及示例

Java HashMap compute()方法及示例

HashMap类的 compute(Key, BiFunction) 方法允许你更新HashMap中的一个值。compute()方法试图为指定的键和其当前的映射值计算一个映射(如果没有找到当前的映射,则为空)。该方法用于 自动更新 HashMap中 给定键的值

  • 如果在compute中传递的重映射函数返回null,则该映射将从Map中删除(如果最初没有,则保持不存在)。

  • 如果重映射函数抛出一个异常,那么该异常将被重新抛出,并且当前的映射将保持不变。

  • 在计算过程中,重映射函数不应该能够修改这个映射。

compute()方法可以用来更新HashMap内部的一个现有值。 例如。

递增映射的一个int值:map.compute(key, (k, v) -> (v == null) ?1 : v+1)

  • 如果compute()方法的重映射函数在计算过程中修改了这个映射,这个方法的默认实现对检测错误没有保证。

异常 :

本方法的非并发实现应该覆盖本方法,如果在计算过程中检测到映射的变化,则抛出ConcurrentModificationException。并发的实现应该覆盖此方法,如果在计算过程中检测到映射的变化,就抛出一个IllegalStateException,结果是计算永远不会完成。

该方法的默认实现对该方法的同步性或原子性不做任何保证。任何提供原子性保证的实现都必须覆盖此方法并记录其并发性属性。

语法

default V 
       compute(K key,
             BiFunction<? super K, ? super V, ? 
                 extends V> remappingFunction)

参数: 该方法接受两个参数。

  • key :与该值相关的键。
  • remappingFunction :计算该值的函数。

返回: 该方法返回 与指定键相关的新值,如果没有则返回空值。

异常: 这个方法会抛出。

  • NullPointerException :如果键是空的,并且这个地图不支持空键,或者remappingFunction是空的。
  • UnsupportedOperationException : 如果这个地图不支持put操作。
  • ClassCastException : 如果键或值的类别阻止它被存储在这个地图中。
  • IllegalArgumentException :如果键或值的某些属性使其不能被存储在这个地图中。

下面的程序说明了 compute(Key, BiFunction) 方法。

程序1 :

// Java program to demonstrate
// compute(Key, BiFunction) method.
  
import java.util.*;
  
public class GFG {
  
    // Main method
    public static void main(String[] args)
    {
  
        // Create a Map and add some values
        Map<String, String> map = new HashMap<>();
        map.put("Name", "Aman");
        map.put("Address", "Kolkata");
  
        // Print the map
        System.out.println("Map: " + map);
  
        // remap the values using compute() method
        map.compute("Name", (key, val)
                                -> val.concat(" Singh"));
        map.compute("Address", (key, val)
                                   -> val.concat(" West-Bengal"));
  
        // print new mapping
        System.out.println("New Map: " + map);
    }
}

输出。

Map: {Address=Kolkata, Name=Aman}
New Map: {Address=Kolkata West-Bengal, Name=Aman Singh}

程序2

// Java program to demonstrate
// compute(Key, BiFunction) method.
  
import java.util.*;
  
public class GFG {
  
    // Main method
    public static void main(String[] args)
    {
  
        // Create a Map and add some values
        Map<String, Integer> map = new HashMap<>();
        map.put("Key1", 12);
        map.put("Key2", 15);
  
        // print map details
        System.out.println("Map: " + map);
  
        // remap the values
        // using compute method
        map.compute("Key1", (key, val)
                                -> (val == null)
                                       ? 1
                                       : val + 1);
        map.compute("Key2", (key, val)
                                -> (val == null)
                                       ? 1
                                       : val + 5);
  
        // print new mapping
        System.out.println("New Map: " + map);
    }
}

输出。

Map: {Key2=15, Key1=12}
New Map: {Key2=20, Key1=13}

程序3: 显示NullPointerException

// Java program to demonstrate Exception thrown by
// compute(Key, BiFunction) method.
  
import java.util.*;
  
public class GFG {
  
    // Main method
    public static void main(String[] args)
    {
  
        // create a Map and add some values
        Map<String, Integer> map = new HashMap<>();
        map.put("Key1", 12);
        map.put("Key2", 15);
  
        // print map details
        System.out.println("Map: " + map);
  
        try {
  
            // remap the values using compute() method
            // passing null value will throw exception
            map.compute(null, (key, value)
                                  -> value + 3);
            System.out.println("New Map: " + map);
        }
        catch (NullPointerException e) {
  
            System.out.println("Exception: " + e);
        }
    }
}

输出。

Map: {Key2=15, Key1=12}
Exception: java.lang.NullPointerException

参考文献: https://docs.oracle.com/javase/10/docs/api/java/util/HashMap.html#compute(K, java.util.function.BiFunction)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程