CodeGym /Java Blog /ランダム /Java の HashMap computeIfAbsent() メソッド
John Squirrels
レベル 41
San Francisco

Java の HashMap computeIfAbsent() メソッド

ランダム グループに公開済み
私たちの多くが知っているように、Java 8 では Stream API が導入されました。これは非常に便利なツールキットですが、 Mapが含まれていないという欠点があります。ただし、Java 8では、「悪い」コードの量を減らすために、Mapインターフェース自体にいくつかの便利なメソッドが追加されました。したがって、 Map内の値を使用して何らかのアクションを実行する必要がある場合、その値が存在する場合は、Java Map にComputeIfPresent()メソッドがあります。Mapにない値を使用して何かを行う必要がある場合は、 ComputeIfAbsent()メソッドを使用できます。この記事ではそれについて考えていきます。

computeIfAbsent() メソッドのシグネチャ


default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
Map (およびHashMap ) computeIfAbsent()メソッド2 つのパラメーターを取ります。最初のパラメータがキーです。2 番目のパラメータは、mappingFunctionです。このメソッドでは、マッピング関数は、マッピングが存在しない場合にのみ呼び出されます。

computeIfAbsent() メソッドの仕組み

すでにご存知のとおり、Map.computeIfAbsent()メソッドには、キーと、このキーの値を計算するための関数という 2 つのパラメーターが渡されます。このメソッドの論理アルゴリズムは次のとおりです。
  1. このメソッドは最初に、渡されたキーがMapに表現されているかどうかを確認します。
  2. キーがMapで表されている場合(かつ null ではない場合)、メソッドは何も行いません。
  3. それ以外の場合、キーがMapで表されていない(または null である) 場合、メソッドはキーへのマッピング関数を使用して値を計算します。
  4. 結果の値が null でない場合は、キーと値のペアをマップに書き込みます。
同じロジックをコードとして書いてみましょう。

if (map.get(key) == null) 
{ 
V newValue = mappingFunction.apply(key); 
if (newValue != null) map.put(key, newValue); 
}

computeIfAbsent() コード例

したがって、値がMapにない場合、メソッドは変更を実行します。簡単な例を見てみましょう。

import java.util.HashMap;
import java.util.Map;

//map.computeIfAbsent example 
public class ComputeIfAbsentExample {

       public static void main(String[] args) {

           Map<String, String> myMap = new HashMap<>();

           myMap.computeIfAbsent("here is my key", key -> key + ", " + "and this is a new value");

           System.out.println(myMap.get("here is my key"));
       }
}
出力は次のとおりです。
これが私のキーで、これが新しい値です
次に、 Map に指定された値がある場合にメソッドが何を行うかを見てみましょう。ネタバレ注意: それは何もしません。

import java.util.HashMap;
import java.util.Map;

public class ComputeIfAbsentExample2 {

       public static void main(String[] args) {

           Map<String, String> myMap = new HashMap<>();
           myMap.put("here is my key", "and here is my value");

           myMap.computeIfAbsent("here is my key", key -> key + ", " + "and this is a new value");

           System.out.println(myMap.get("here is my key"));
       }
}
出力は次のとおりです。
そしてこれが私の価値です
ご覧のとおり、値は変化しません。

ComputeIfAbsent() のもう 1 つの例

キャッシュの概念に精通している場合は、computeIfAbsent()メソッドを見て何かを思い出されるかもしれません。より複雑な解析の例を見てみましょう。computeIfAbsent()メソッドを 2 回呼び出して、最初のケースでは値が変更され、2 番目のケースでは値が変更されていないことを確認してみましょう。

import java.util.HashMap;
import java.util.Map;

public class ComputeIfAbsentExample {
   private static Map<String, Long> numbersMap = new HashMap<>();

   public static Long stringToLong(String str) {
       return numbersMap.computeIfAbsent(str, key -> {
           System.out.println("parsing: " + key);
           return Long.parseLong(key);
       });
   }

   public static void main(String[] args) {
       // will print:
       // > parsing: 10
       // > parsing: 25
       // > 10+25=35
       System.out.println("10+25=" + (stringToLong("10") + stringToLong("25")));
       // will print:
       // > parsing: 20
       // > 10+25=45
       // only "20" will be parsed this time, since "25" was already parsed and placed into `numbersMap` map before
       System.out.println("20+25=" + (stringToLong("20") + stringToLong("25")));
       // will print:
       // > 10+20=30
       // no parsing will occur, since both "10" and "20" were already parsed and placed into `numbersMap` map before
       System.out.println("10+20=" + (stringToLong("10") + stringToLong("20")));
   }

}
出力は次のとおりです。
解析: 10 解析: 25 10+25=35 解析: 20 20+25=45 10+20=30
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION