2016-10-10 53 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

用'e - > e.getKey().toUppercase()'替換'Map.Entry :: getKey'? – 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

請提供downvote的原因,因爲它爲我工作。 – Ajeetkumar

+0

我的直覺說@svarog提供的答案會更快。 – Snekse

3

這不需要收藏家的任何特殊操作。比方說你有這個地圖

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

只是得到一個流爲keySet()和收集到一個新的地圖,您插入的大寫鍵:

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

// ONE - 1 
// TWO - 2 

編輯:

@ Holger的評論是正確的,只是使用入門套件會更好(也更清潔),所以這裏是更新的解決方案

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

重新定義任務,同時改變輸入和輸出,以得出結論,它可以比OP的實際任務更簡單地實現,這不是一個真正的解決方案。除此之外,通過'keySet'進行流式傳輸可能看起來更簡單,但是與首先對entrySet()進行流式傳輸相比,對每個*鍵進行查找會浪費資源,這會爲免費提供映射值。 – Holger

相關問題