2016-08-17 4 views
0

HashMapでキーを変換したいと思います。マップにはlower_underscoreキーがありますが、マップにはcamelCaseキーが必要です。マップにはヌル値も含まれます。マップのキーをマップする最も良い方法

これを行うにはstraightfowardコードはここにある:)私はグアバのMaps.transformValues()またはMaps.transformEntries(のようにこれを行うための方法を知りたい

Map<String, Object> a = new HashMap<String, Object>() {{ 
     put("foo_bar", 100); 
     put("fuga_foga", null); // A value may be null. Collectors.toMap can't handle this value. 
    }}; 
    Map<String, Object> b = new HashMap<>(); 
    a.forEach((k,v) -> b.put(toCamel(k), v)); 

が、これらの方法は、単に値を変換します。

Collectors.toMap()もクローズですが、このメソッドはnull値が存在する場合にNullPointerExceptionをスローします。

Map<String, Object> collect = a.entrySet().stream().collect(
      Collectors.toMap(x -> toCamel(x.getKey()), Map.Entry::getValue)); 
+1

「Collectors:toMap' NPEに関するディスカッション:http://stackoverflow.com/questions/24630963/java-8-nullpointerexception-in-collectors-tomap – Dhananjay

答えて

1

あなたは絶対にこの使用してストリームを解決したい場合、あなたはこのようにそれを行うことができます:

Map<String, Object> b = a.entrySet() 
    .stream() 
    .collect(HashMap::new, 
      (m, e) -> m.put(toCamel(e.getKey()), e.getValue()), 
      HashMap::putAll); 

しかし、私は読むことがあなたの質問に示す「従来」の方法は、簡単に見つけます

Map<String, Object> b = new HashMap<>(); 
a.forEach((k,v) -> b.put(toCamel(k), v)); 
1

これはコメントとして意図されていますが、長すぎます。

GuavaのMaps.transformValues()やMaps.transformEntries()のようなものは、あまり意味がないと思います。
これらのメソッドは元のマップのビューを返します。キーを使用して の値を取得すると、指定した関数によって値が変換されます。 (私はGuavaに慣れていないのでここで間違っているかもしれませんが、ドキュメントに基づいてこれらの前提を作っています)

キーを「変換」したい場合は、そのようなマップ:あなたはヘビのケースキーでマップを持っていますが、キャメルケースの鍵をしたい、あなたの場合は

public class KeyTransformingMap<K, V> implements Map { 
    private Map<K, V> original; 
    private Function<K, K> reverseTransformer; 

    public V get(Object transformedKey) { 
     K originalKey = reverseTransformer.apply((K) transformedKey); 
     return original.get(originalKey); 
    } 

    // delegate all other Map methods directly to original map (or throw UnsupportedOperationException) 
} 

は、 reverseTransformer関数はキャメルケース文字列に取ると蛇ケース文字列を返します。
e reverseTransformer.apply("snakeCase")"snake_case"を返し、元のマップのキーとして使用できます。

あなたが提案した簡単なコードが最良の選択肢だと私は思っています。

関連する問題