2015-06-11 8 views
8

मैं एक lookupFunction साथ NameValuePair रों की एक धारा (जो एक Function रिटर्न) मैप करने के लिए कार्य की एक सूची लागू करें, इस तरह:एक जावा स्ट्रीम का .map() विधि

List<NameValuePair> paramPairs = getParamPairs(); 
List<NameValuePair> newParamPairs = paramPairs.stream() 
       .map((NameValuePair nvp) -> lookupFunction(nvp.getName()).apply(nvp)) 
       .flatMap(Collection::stream) 
       .collect(toList()); 

लेकिन क्या होगा अगर lookupFunction एक लौटे इसके बजाय Collection<Function>, और मैं को प्रत्येक Function एस के साथ प्रदर्शन करना चाहता था। मुझे यह कैसे करना है?

+1

नोट: यदि आप वर्तमान कोड लिखा जा सकता है: 'stream.map (NameValuePair :: getName) .map (यह :: lookupFunction) ...' – assylias

उत्तर

3

lookupFunction(nvp.getName()) कार्यों के एक संग्रह देता है, तो आपको लगता है कि संग्रह की एक धारा हो और NameValuePair को इसे लागू करने के परिणाम के प्रत्येक कार्य को मैप कर सकते हैं:

List<NameValuePair> newParamPairs = paramPairs.stream() 
      .flatMap((NameValuePair nvp) -> lookupFunction(nvp.getName()).stream().map(func -> func.apply(nvp))) 
      .flatMap(Collection::stream) 
      .collect(toList()); 
+0

धन्यवाद! ऐसा लगता है कि मुझे अभी भी उस दूसरे की आवश्यकता है। फ्लैटमैप (संग्रह :: स्ट्रीम) – neu242

+1

@ neu242 क्यों? क्या प्रत्येक फंक्शन :: लागू होता है एक संग्रह के बदले एक संग्रह? यह सवाल से स्पष्ट नहीं था, इसलिए मैंने '.flatMap (संग्रह :: स्ट्रीम) 'हटा दिया। – Eran

+0

आह, ज़ाहिर है। हाँ, यही कारण है। – neu242

1

मैं एक समारोह है कि तैयार करता प्रयोग करेंगे एक समारोह में कार्यों का संग्रह। इसके बजाय उसका उपयोग lookupFunction की मेरी कोड में

Function<String, Function<NameValuePair, NameValuePair>> composedFun = 
    x -> lookupFunctions(x) 
      .stream() 
      .reduce((fun1, fun2) -> fun1.andThen(fun2)) 
      .orElse(y -> y); 
... 
    .map(nvp -> composedFun.apply(nvp.getName()).apply(nvp)) 
... 
संबंधित मुद्दे