2016-08-20 6 views
3

マップから値を取得するための簡単なユーティリティ関数を作成しようとしています。新しい値クラスを作成して地図に配置することができない場合は、新しい地図エントリを取得または作成する方法

マップのキーと値のクラスを実行時に取得することは非常に困難ですが、私が思いつくことができる最高のものは、次の行にはひどいものです。

良い方法がありますか?

private Object getOrCreate(Map<Object, Object> map, Object key, Class<?> mapValueClass) { 
    Object value = map.get(key);  

    if (value == null) {      
     Constructor<?> con = mapValueClass.getConstructor(key.getClass()); 
     value = con.newInstance(key); 
     map.put(key, value);    
    } 

    return value; 
} 

答えて

6

あなたは(のJava 8で追加)Map::getOrDefaultMap::computeIfAbsentを清算する必要があります。それらはあなたの関数がするはずのものとほとんど同じです。 2つの違いは、getOrDefaultは、メソッドが呼び出される前に作成された既存のインスタンスを受け入れ、必要に応じてそれを返しますが、マップに追加しません。computeIfAbsendは新しい値を遅く作成する関数を受け入れます。その値をマップに追加してください。

Map<String, List<Integer>> map = new HashMap<>(); 

List<Integer> list1 = map.getOrDefault("foo", Collections.emptyList()); 
System.out.println(list1); // empty list 
System.out.println(map); // map is still empty 

List<Integer> list2 = map.computeIfAbsent("bar", s -> new ArrayList<Integer>()); 
System.out.println(list2); // empty list 
System.out.println(map); // entry added to map 

あなたは、例えば)可能性がありますが、常にパラメータとして、キーとバリュークラスの新しいインスタンスを作成したいと仮定すると、そのクラスは、実際に、このようなコンストラクタを持っていると仮定しますこれを使用してください:

YourClass obj = map.computeIfAbsent(key, YourClass::new); 
+0

確かにそれは十分です。ポインタありがとう。 – Ian

関連する問題