2017-06-05 36 views
5

पर आपरेशन को कम मैं एक java.util.stream.Stream जैसे प्रमुख मूल्य जोड़े युक्त मिल गया है: मैं सभी प्रविष्टियों, जो एक ही मिल गया है मर्ज करना चाहते हैंजावा 8: निष्पादित स्ट्रीम

<1,3> <1,5> <3,1> <4,2> <4,7> <4,8> 

अब कुंजी:

<1,[3,5]> <3,[1]> <4,[2,7,8]> 

डेटा पहले ही सॉर्ट किया गया है, इसलिए केवल लगातार डेटासेट को विलय करना होगा।

अब मैं एक तरह से ऊपर की तरह धारा की सामग्री को बदलने के लिए के लिए खोज रहा हूँ, स्मृति में सभी डेटासेट लोड किए बिना।

मैं एक ही मान के बजाय मानों की सूची से युक्त एक अलग ऑब्जेक्ट प्रकार के साथ परिणाम के रूप में एक java.util.stream.Stream पाने के लिए पसंद करेंगे।

मेरी केवल दृष्टिकोण एक कस्टम इटरेटर, जो मर्ज करता है, लेकिन यह बहुत पुनरावर्तक में बदलने के लिए बदसूरत हो रहा है और वापस स्ट्रीम करने के लिए।

इसके लिए सबसे अच्छा तरीका क्या है?

+6

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

+0

मुझे लगता है कि स्ट्रीम में जो कुछ भी है, उसके आधार पर '.groupBy()' ऑपरेशन काम कर सकता है। @LouisWasserman आपकी आवश्यकताओं को बेहतर समझ सकता है, हालांकि। – KevinO

+0

@ केविनो, ओपी ने विशेष रूप से कहा कि वे परिणाम के रूप में स्ट्रीम नहीं चाहते थे, और डेटा को स्मृति में लोड करने से बचने के लिए। 'ग्रुपिंग' आपको उनको करने नहीं देगा। –

उत्तर

4

यहाँ SteamEx द्वारा समाधान है।

int[][] datasets = { { 1, 3 }, { 1, 5 }, { 3, 1 }, { 4, 2 }, { 4, 7 }, { 4, 8 } }; 

StreamEx.of(datasets) // 
     .collapse((a, b) -> a[0] == b[0], groupingBy(a -> a[0], mapping(a -> a[1], toList()))) // 
     .forEach(System.out::println); 

आप अपने dataset वस्तु के साथ int[] बदल सकते हैं। हम अगर यह आलसी लोड हो रहा है/गणना सत्यापित करने के लिए peek जोड़ सकते हैं:

StreamEx.of(datasets) // 
     .peek(System.out::println) // 
     .collapse((a, b) -> a[0] == b[0], groupingBy(a -> a[0], mapping(a -> a[1], toList()))) // 
     .limit(1) // 
     .forEach(System.out::println); 
संबंधित मुद्दे