2016-10-05 12 views
7

है, मैं पीओजेओ की सूची चलाने के लिए जावा स्ट्रीम का उपयोग करना चाहता हूं, जैसे सूची List<A> नीचे सूचीबद्ध करें, और इसे मानचित्र Map<String, Set<String>> में बदलें।जावा स्ट्रीम संग्राहक.टैप मूल्य एक सेट

उदाहरण के लिए, वर्ग एक है:

final List<A> as = new ArrayList<>(); 
// the list as is populated ... 

// works if there are no duplicates for name 
final Map<String, String> m = as.stream().collect(Collectors.toMap(x -> x.name, x -> x.property)); 

हालांकि, क्योंकि वहाँ एक ही साथ कई POJOs हो सकता है:

class A { 
    public String name; 
    public String property; 
} 

मुझे लगता है कि नीचे कोड मानचित्र Map<String, String> में मूल्यों एकत्र करता है लिखा था name, मुझे लगता है कि मानचित्र का मूल्य Set हो। सभी property उसी कुंजी के लिए स्ट्रिंग्स name एक ही सेट में जाना चाहिए।

यह कैसे किया जा सकता है?

// how do i create a stream such that all properties of the same name get into a set under the key name 
final Map<String, Set<String>> m = ??? 

उत्तर

15

groupingBy बिल्कुल वही करती आप क्या चाहते हैं:

import static java.util.stream.Collectors.*; 
... 
as.stream().collect(groupingBy((x) -> x.name, mapping((x) -> x.property, toSet()))); 
+2

छोटे सुधार, मुझे लगता है कि यह स्थिर java.util.stream.Collectors आयात करना चाहिए। *; – tkja

+1

वूप्स, सही: डी – Nevay

+1

आपको एक लैम्ब्डा पैरामीटर के चारों ओर कोष्ठक की आवश्यकता नहीं है। – shmosel

0

इसके अलावा, आप Collectors.toMap समारोह Collectors.toMap (keyMapper, valueMapper, mergeFunction) के विलय के समारोह विकल्प का उपयोग कर सकते हैं इस प्रकार है:

final Map<String, String> m = as.stream() 
           .collect(Collectors.toMap(
              x -> x.name, 
              x -> x.property, 
              (property1, property2) -> property1+";"+property2); 
+0

प्रश्न सेट करने के लिए मान एकत्र करने के बारे में था लेकिन स्ट्रिंग नहीं। – splatch

0

@Nevay के जवाब निश्चित रूप से groupingBy का उपयोग करके जाने के लिए सही रास्ता है, लेकिन यहद्वारा भी प्राप्त हैतीसरे पैरामीटर के रूप में एक mergeFunction जोड़कर:

as.stream().collect(Collectors.toMap(x -> x.name, 
    x -> new HashSet<>(Arrays.asList(x.property)), 
    (x,y)->{x.addAll(y);return x;})); 

इस कोड x.name के रूप में एक महत्वपूर्ण और x.property के रूप में एक मूल्य के साथ HashSet के रूप में एक मूल्य के साथ एक नक्शा करने के लिए सरणी मैप करता है। जब डुप्लिकेट कुंजी/मान होता है, तो तीसरा पैरामीटर विलय फ़ंक्शन को दो हैशसेट को मर्ज करने के लिए बुलाया जाता है।

पी एस। यदि आप अपाचे कॉमन लाइब्रेरी का उपयोग करते हैं, तो आप विलय

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