2016-12-10 7 views
1

この質問は、com.google.common.collect.Multimapのマルチマップに関連しています。あるマルチマップから別のマルチマップにエントリをコピーする

私は1つのMultimapを持っていますが、キーワードで始まるキーを別の一時的なMultimapにコピーする方がシンプルで便利な方法はありますか? - 私の現在の解決策は以下の通りです。

private Multimap<String, String> copyDesiredMetadata(Multimap<String, String> metadata) 
{ 
    Multimap<String, String> returnedMap = new CaseInsensitiveKeyMultimap<>(); 

    // Iterate through the entries in the metadata 
    for (Map.Entry entry : metadata.entries()) { 
     String key =entry.getKey().toString(); 
     // If the entry has the field key we are looking for add to returned map. 
     if (key.startsWith("AAA") || key.startsWith("BBB") || key.startsWith("CCC") || key.startsWith("DDD")) { 
      returnedMap.put(key, entry.getValue().toString()); 
     } 
    } 
    return returnedMap; 
} 
+0

metadata' 'の種類は何ですか? – YoungSpice

+0

申し訳ありませんが、メタデータが渡されたメソッドヘッダーを含めるように編集します。これはMultimap conapart3

答えて

3

私は、より機能的なアプローチここで定義されなければならない「より便利」と考えているが、私はこの実装について知らないが、あなたが必要として、私はImmutableMultimap代わりのCaseInsensitiveKeyMultimapを使用

ImmutableMultimap<String, String> yourNewMap = metadata.entries() 
      .stream() 
      .filter(entry -> entry.getKey().matches("(AAA|BBB|CCC|DDD).*")) 
      .collect(Collector.of(ImmutableMultimap.Builder<String, String>::new, 
        ImmutableMultimap.Builder<String, String>::put, 
        (left, right) -> { 
         left.putAll(right.build()); 
         return left; 
        }, 
        ImmutableMultimap.Builder::build)); 

お知らせ簡単にそれを適応させることができます。コードがきれいに見えるよう

個人的に、私は、ユーティリティクラスにコレクタを抽出します... .collect(MoreCollectors.toCaseInsensitiveKeyMultimap())

関連する問題