2015-11-03 51 views
5

में मैपर्स की एक स्ट्रीम को अन्य स्ट्रीम में लागू करें जावा 8 में मेरे पास एक स्ट्रीम है और मैं मैपर्स की स्ट्रीम लागू करना चाहता हूं।जावा 8

उदाहरण के लिए

:

Stream<String> strings = Stream.of("hello", "world"); 
Stream<Function<String, String>> mappers = Stream.of(t -> t+"?", t -> t+"!", t -> t+"?"); 

मैं लिखना चाहते हैं:

strings.map(mappers); // not working 

लेकिन मेरे काम के हल के लिए अपने मौजूदा सबसे अच्छा तरीका है:

for (Function<String, String> mapper : mappers.collect(Collectors.toList())) 
    strings = strings.map(mapper); 

strings.forEach(System.out::println); 

मैं इस समस्या को कैसे हल कर सकते हैं

  • मेरी धाराप्रवाह कोड

उत्तर

8

तोड़ने map के बाद से बिना एक for पाश

  • का उपयोग किए बिना एक सूची
  • में मानचित्रकारों संग्रह के बिना एक समारोह कि प्रत्येक तत्व के लिए लागू किया जा सकता की आवश्यकता है, लेकिन अपने Stream<Function<…>> केवल किया जा सकता है एक ही समय का मूल्यांकन किया गया, धारा को पुन: प्रयोज्य करने के लिए प्रक्रिया को अपरिहार्य है। यह एक Collection नहीं होना चाहिए, तो बस यह एक एकल Function को कम करने:

    strings.map(mappers.reduce(Function::andThen).orElse(Function.identity())) 
    

    पूरा उदाहरण:

    Stream<Function<String, String>> mappers = Stream.of(t -> t+"?", t -> t+"!", t -> t+"?"); 
    Stream.of("hello", "world") 
         .map(mappers.reduce(Function::andThen).orElse(Function.identity())) 
         .forEach(System.out::println); 
    
  • +1

    अन्य रूपों है कि काम करते हैं: 'mappers.reduce (Function.identity(), समारोह :: और फिर) ',' mappers.reduce (फंक्शन.डिडिटी(), फंक्शन :: लिखें) '। – rgettman

    +3

    @getgetman: 'orElse' संस्करण एक छोटा अनुकूलन है क्योंकि यह किसी अन्य फ़ंक्शन के साथ पहचान फ़ंक्शन को गठबंधन नहीं करता है। – Holger

    +0

    यह अच्छा होगा अगर 'function.identity()' ओवरराइड 'लिखें' और 'और फिर' ... या शायद जेआईटी कंपाइलर इस जटिलता से छुटकारा पायेगा? –