2016-10-10 4 views
1

私はJava 8ストリームを使用してマップキーを大文字に変換する方法は?

private Map<String,List<String>> createTableColumnListMap(List<Map<String,String>> nqColumnMapList){ 

     Map<String, List<String>> targetTableColumnListMap = 
       nqColumnMapList.stream() 
        .flatMap(m -> m.entrySet().stream()) 
        .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList()))); 
     return targetTableColumnListMap; 
    } 

以下のような方法を持っている私はマップのキーを大文字にしたいが、それを行うための方法を見つけることができませんでした。これを達成するためのJava 8の方法はありますか? [コピーして貼り付けることができます]あなたの質問のための

+0

'Map.Entry :: getKey'を' e - > e.getKey()。toUppercase() 'に置き換えますか? – Holger

答えて

1

回答:

Map<String, List<String>> targetTableColumnListMap = nqColumnMapList.stream().flatMap(m -> m.entrySet().stream()) 
       .collect(Collectors.groupingBy(e -> e.getKey().toUpperCase(), Collectors.mapping(Map.Entry::getValue, Collectors.toList()))); 
+0

あなたが落選したときには、何か説明をしておく方が良いでしょう。静かにダウン投票しても、あなたはより知的になりません。私が伝えたいことを見ずにダウン投票したので、あなたはまだインテリジェントではありません。 – cody123

+0

plsは私のために働いたのでdownvoteの理由を提供します。 – Ajeetkumar

+0

私の腸は、@svarogによって提供される答えがより速くなると言います。 – Snekse

3

これはコレクターのいずれかの空想の操作を必要としません。

Map<String, Integer> newMap = imap.keySet().stream() 
     .collect(Collectors.toMap(key -> key.toUpperCase(), key -> imap.get(key))); 

// ONE - 1 
// TWO - 2 

編集:

Map<String, Integer> imap = new HashMap<>(); 
imap.put("One", 1); 
imap.put("Two", 2); 

ちょうどkeySet()のためのストリームを取得し、キーを使って挿入大文字されている新しいマップに集めるあなたはこのマップを考えてみましょう

@ Holgerのコメントは正しいですが、エントリーセットを使用する方が良い(そしてよりクリーンな)ので、ここに更新された解決策があります。

Map<String, Integer> newMap = imap.entrySet().stream() 
      .collect(Collectors.toMap(entry -> entry.getKey().toUpperCase(), entry -> entry.getValue())); 
+1

OPの実際のタスクより簡単に実装できるという結論に達するように、タスクを再定義し、入力と出力の両方を変更することは実際の解決策ではありません。それに加えて、 'keySet'のストリーミングはより簡単に見えるかもしれませんが、* every *キーのルックアップを実行することは、最初は' entrySet() 'をストリーミングするのに比べてリソースの無駄です。 。 – Holger

関連する問題