मैं गैर-टर्मिनल ग्रुपिंग ऑपरेशन को लागू करने का एक तरीका ढूंढ रहा हूं, जैसे मेमोरी ओवरहेड न्यूनतम होगा।जावा स्ट्रीम - क्रमबद्ध धाराओं पर क्रमबद्ध वस्तुओं को
उदाहरण के लिए, अलग() पर विचार करें। सामान्य मामले में, इसमें सभी विशिष्ट वस्तुओं को इकट्ठा करने के अलावा कोई विकल्प नहीं है, और केवल तभी उन्हें आगे स्ट्रीम करें। हालांकि, अगर हम जानते हैं कि इनपुट स्ट्रीम पहले से ही क्रमबद्ध है, तो न्यूनतम मेमोरी का उपयोग करके ऑपरेशन "ऑन-द-फ्लाई" किया जा सकता है।
मुझे पता है कि मैं इसे इटरेटर रैपर का उपयोग करके और समूहबद्ध तर्क को लागू करने के लिए इसे प्राप्त कर सकता हूं। इसके बजाए स्ट्रीम एपीआई का उपयोग करके इसे कार्यान्वित करने का कोई आसान तरीका है?
private static class DedupSeq implements IntFunction<IntStream> {
private Integer prev;
@Override
public IntStream apply(int value) {
IntStream res = (prev != null && value == prev)? IntStream.empty() : IntStream.of(value);
prev = value;
return res;
}
}
और फिर:
- - संपादित
मैं (..) इस लक्ष्य को हासिल करने के लिए एक तरह से Stream.flatMap दुरुपयोग पाया
IntStream.of(1,1,3,3,3,4,4,5).flatMap(new DedupSeq()).forEach(System.out::println);
कौन सा प्रिंट:
1
3
4
5
कुछ बदलावों के साथ, उसी तकनीक का उपयोग धाराओं के किसी भी प्रकार के स्मृति-कुशल अनुक्रम समूह के लिए किया जा सकता है। वैसे भी, मुझे इस समाधान को बहुत पसंद नहीं है, और मैं कुछ और प्राकृतिक खोज रहा था (उदाहरण के लिए मैपिंग या फ़िल्टरिंग के तरीके की तरह)। इसके अलावा, मैं यहां अनुबंध तोड़ रहा हूं क्योंकि flatMap (..) को प्रदान किया गया कार्य राज्यपूर्ण है।
आप हमेशा '.filter (someSet :: जोड़ें) ', लेकिन क्या आपने सादे 'विशिष्ट()' के साथ इस तरह के समाधान के प्रदर्शन की कोशिश की और तुलना की है? साथ ही, आप "सामान्य मामले में" कहते हैं, लेकिन हो सकता है कि 'स्ट्रीम' _is_ 'ORDERED', ठीक से (या अधिक सटीक रूप से, इसके अंतर्निहित 'स्प्लिटरेटर') – fge
@fge: मुझे यकीन नहीं है कि वहां कोई अनुकूलन है। कोड: IntStream.range (0, 100000000) .डिस्टिंक()। प्रत्येक (x -> {}) के लिए; अंतर्निहित स्प्लिटरेटर स्वयं को ऑर्डर करने की रिपोर्ट के बावजूद स्मृति से बाहर चला जाता है। –
क्या आपने 'forEachOrdered() 'के साथ प्रयास किया है? – fge