2016-09-25 11 views
6

मेरे पास एक स्थिर विधि String Converter.convert(String, Integer) है।दो पैरा प्राप्त करने वाले फ़ंक्शन का उपयोग करके किसी मानचित्र की कुंजी + मान को नए मान में बदलने के लिए जावा 8 स्ट्रीम का उपयोग कैसे करें?

मेरे पास एक नक्शा भी है: Map<String, Integer> map

मैं मानचित्र पर दौड़ना चाहता हूं और कनवर्ट विधि का उपयोग कर प्रत्येक प्रविष्टि को एक स्ट्रिंग में परिवर्तित करना चाहता हूं और प्रत्येक परिवर्तित स्ट्रिंग का उपयोग जारी रखना चाहता हूं।

map.entrySet().stream().map(e -> Converter.convert(e.getKey(), e.getValue()))....;

इसमें अधिक सहज ज्ञान युक्त करने के लिए एक रास्ता है:

मैं इसे इस तरह से कर सकते हैं? कुछ पसंद है?

map.stream(Converter::convert)... ???

या

map.stream((k, v) -> Converter.convert(k, v)))... ???

+1

नहीं वास्तव में: यह एक विशेष वर्ग EntryStream<K, V> जो Stream<Entry<K, V>> लागू करता है और mapKeyValue जो एक आप की जरूरत है सहित अतिरिक्त काम तरीके प्रदान होता है। आप एक विधि को परिभाषित कर सकते हैं जो 'एंट्री' लेता है और आपकी 'कन्वर्ट' विधि को कॉल करता है। 'Map.forEach' 'BiConsumer' लेता है, लेकिन यह कुछ भी वापस नहीं लौटाता है, इसलिए बहुत उपयोगी नहीं है। –

+0

मैं चाहता था कि वहां था! –

उत्तर

0

यह उतना ही अच्छा है जितना आप प्राप्त करने जा रहे हैं।

आपकी Converter::convert विधि काम करेगी यदि यह Map.Entry<String, Integer> को तर्क के रूप में लेती है। मैं इसके खिलाफ सलाह दूंगा क्योंकि गैर-मानचित्र संदर्भों में आपके कनवर्टर का उपयोग करने पर इसका नकारात्मक प्रभाव होगा।

यदि आप Map.forEach विधि का उपयोग करते हैं तो आपका दो-तर्क लैम्ब्डा सुझाव काम करेगा, हालांकि इसका उपयोग आपके द्वारा किए जा रहे हेरफेर के लिए नहीं किया जा सकता है। जब तक आप अपनी स्ट्रीम लेते हैं, तो आपके पास Stream<Map.Entry<String, Integer>> है। जबकि इस संदर्भ में दो-बहस लैम्ब्डा समझ में आ सकते हैं, कंपाइलर को यह जानने का कोई तरीका नहीं है कि Map.Entry को दो तर्कों में कैसे परिवर्तित किया जाए।

5

आप इस तरह की कुछ उपयोगिता कक्षा में एक एडाप्टर स्थिर विधि बना सकते हैं:

public class Functions { 
    public static <K, V, R> Function<Map.Entry<K, V>, R> entryFunction(
      BiFunction<? super K, ? super V, ? extends R> fn) { 
     return entry -> fn.apply(entry.getKey(), entry.getValue()); 
    } 
} 

अब आप इसे इस तरह उपयोग कर सकते हैं:

import static Functions.*; 

map.entrySet().stream().map(entryFunction(Converter::convert))... 

एक वैकल्पिक समाधान का उपयोग किया जाएगा कुछ तृतीय-पक्ष लाइब्रेरी जो जावा 8 स्ट्रीम एपीआई बढ़ाती है। इस तरह के पुस्तकालयों में से एक मुफ्त StreamEx लाइब्रेरी है जिसे मैंने लिखा था।

EntryStream.of(map).mapKeyValue(Converter::convert)... 
संबंधित मुद्दे

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