2015-11-01 7 views
13

मेरे पास एक नक्शा है जहां मान स्ट्रिंग हैं और कुंजी सूचियां हैं: Map<String, List<BoMLine>> materials। मैं इस मानचित्र को अपने मूल्यों से फ़िल्टर करना चाहता हूं; इस तरह कुछ:जावा 8 में अपने मानों से मानचित्र को फ़िल्टर कैसे करें?

materials.entrySet().stream() 
     .filter(a->a.getValue().stream() 
      .filter(l->MaterialDao.findMaterialByName(l.getMaterial()).ispresent) 

लेकिन यह मेरे लिए काम नहीं कर रहा है। क्या किसी के पास एक विचार है?

धन्यवाद।

उत्तर

15

अगर मैं अपने फ़िल्टरिंग मापदंड सही ढंग से समझ, आप अगर फ़िल्टर्ड Stream आप मूल्य List से उत्पादित किसी भी तत्व है जाँच करना चाहते हैं, और यदि हां, उत्पादन Map करने के लिए इसी Map प्रविष्टि पास।

Map<String, List<BoMLine>> 
    filtered = materials.entrySet() 
         .stream() 
         .filter(a->a.getValue() 
            .stream() 
            .anyMatch(l->MaterialDao.findMaterialByName(l.getMaterial()))) 
         .collect(Collectors.toMap(e->e.getKey(),e->e.getValue())); 

यह MaterialDao.findMaterialByName(l.getMaterial()) संभालने है एक boolean देता है।

+0

मुझे अपने समाधान के बारे में निश्चित नहीं है और यह काम नहीं कर रहा है जब मैं इसे "ई" मानचित्र पर संग्रहीत करना चाहता हूं एक मानचित्र यह सिर्फ एक वस्तु है – Nazila

+1

@ नाज़ीला 'ई' एक 'नक्शा है। प्रविष्टि <स्ट्रिंग, सूची >'। मैंने कॉल में 'संग्रह' करने के लिए कुछ मूर्खतापूर्ण वाक्यविन्यास त्रुटियां की हैं। संपादित उत्तर देखें। – Eran

+2

आपको 'फ़िल्टर()' का उपयोग करने की आवश्यकता नहीं है, बस 'anyMatch() 'के लिए तर्क के रूप में भविष्य को पास करें। –

0

अंत में यह काम किया है, मेरी दूसरी फिल्टर पूरी तरह से बेकार जवाब इस तरह है था:

static <K, V> Map<K, V> filterByValue(Map<K, V> map, Predicate<V> predicate) { 
    return map.entrySet() 
      .stream() 
      .filter(entry -> predicate.test(entry.getValue())) 
      .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); 
} 

कॉल:

Map<String, List<BoMLine>> 
filtered = materials.entrySet() 
        .stream() 
        .filter(a -> a 
         .getValue() 
         .stream() 
         .allMatch(
          b -> MaterialDao.findMaterialByName(
            b.getMaterial()).isPresent())) 
      .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue())) 
+0

यदि आपको बाद में स्रोत मानचित्र की आवश्यकता नहीं है और यह उत्परिवर्तनीय है, तो ऑपरेशन को जगह पर करने पर विचार करें: 'material.values ​​()। RemoveIf (a ->! A.stream()। AllMatch (b -> MaterialDao.findMaterialByName (b .getMaterial())। isPresent())) ' – Holger

8

आम तौर पर, यह कैसे आप अपने मूल्यों के द्वारा नक्शे को फ़िल्टर कर सकते हैं है यह इस तरह है:

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

Map<String, Integer> filteredMap = filterByValue(originalMap, value -> value == 2); 

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

assertEquals(expectedMap, filteredMap); 
संबंधित मुद्दे