2016-01-11 24 views
11

मेरे पास Map<A, Map<B, C>> है और मैं जावा स्ट्रीम का उपयोग करके Map<B, List<C>> प्राप्त करना चाहता हूं।जावा स्ट्रीम: आंतरिक मानचित्र कुंजी द्वारा समूहित मान प्राप्त करें

public <A, B, C> Map<B, List<C>> groupsByInnerKey(Map<A, Map<B, C>> input) { 
    return input.values() 
      .stream() 
      .flatMap(it -> it.entrySet().stream()) 
      .collect(Collectors.groupingBy(Map.Entry::getKey)); 
} 

मैं क्या उम्मीद:

मैं इस प्रकार के रूप में यह करने की कोशिश

  • flatMap के StreamMap.Entry<B, C>
  • collect(Collectors.groupingBy(...)) समारोह जो Map.Entry<B, C> के लिए आवेदन किया और B देता है लेता है देता है, इस प्रकार यह C के मान List<C> में एकत्र करता है।

लेकिन यह संकलन नहीं है, सचमुच:

गैर स्थिर विधि अंतिम पंक्ति में Map.Entry::getKey पर एक स्थिर संदर्भ

से संदर्भित नहीं किया जा सकता।

क्या कोई यह बता सकता है कि क्या गलत है या मैं क्या हासिल करना चाहता हूं?

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/29373026/how-to-get-all-values-from-the-inner-maps-of-a-map-using-a-common -key –

+0

@ शिलादित्य चक्रवर्ती, असल में नहीं, मैं इस बारे में पूछ रहा हूं कि ऐसा करने का अपेक्षित तरीका क्यों काम नहीं करता है। साथ ही, कार्य आपके द्वारा संदर्भित प्रश्न से थोड़ा अलग है। – hotkey

उत्तर

11

आपका स्ट्रीम Map.Entry वस्तुओं से बना है, लेकिन आप को इकट्ठा करना चाहते हैं चाहते हैं वास्तव में प्रविष्टि का मान:

क्या एक Map<B, List<C>>, आप एक mapping कि नक्शा होगा Map.Entry<B,C>C को जोड़ने की जरूरत है पाने के लिए , प्रवेश खुद ही नहीं। आपके वर्तमान कोड के साथ, आपको Map<B, List<Map.Entry<B, C>>> प्राप्त होगा।

इस तरह, आप बस Collectors.mapping पर कॉल खो रहे हैं। यह संग्राहक दिए गए मैपर फ़ंक्शन के साथ स्ट्रीम तत्व को मानचित्र करेगा और परिणामस्वरूप डाउनस्ट्रीम कंटेनर में एकत्र करेगा। इस मामले में, मैपर Map.Entry::getValue है (इसलिए मानचित्र प्रविष्टि से मूल्य लौटा रहा है) और डाउनस्ट्रीम कलेक्टर List में एकत्रित होता है।

public <A, B, C> Map<B, List<C>> groupsByInnerKey(Map<A, Map<B, C>> input) { 
    return input.values() 
      .stream() 
      .flatMap(it -> it.entrySet().stream()) 
      .collect(Collectors.groupingBy(
       Map.Entry::getKey, 
       Collectors.mapping(Map.Entry::getValue, Collectors.toList()) 
      )); 
} 
+1

धन्यवाद, यह काम किया। तो, मैं वास्तव में संकलक के त्रुटि संदेश से उलझन में था। यह गैर-स्थैतिक संदर्भ के बारे में नहीं, प्रकार के मेल के बारे में कहना चाहिए। :) – hotkey

7

आपकी स्ट्रीम पाइपलाइन Map<B, List<Map.Entry<B,C>>> लौटाती है, Map<B, List<C>> नहीं।

return input.entrySet() 
     .stream() 
     .flatMap(it -> it.getValue().entrySet().stream()) 
     .collect(Collectors.groupingBy(Map.Entry::getKey,Collectors.mapping(Map.Entry::getValue,Collectors.toList()))); 
संबंधित मुद्दे

 संबंधित मुद्दे