रिवर्स उत्पन्न करने के विशिष्ट प्रश्न के लिए IntStream
, कुछ इस तरह से प्रयास करें:
static IntStream revRange(int from, int to) {
return IntStream.range(from, to)
.map(i -> to - i + from - 1);
}
यह बॉक्सिंग और सॉर्टिंग से बचा जाता है।
किसी भी प्रकार की धारा को उल्टा करने के सामान्य प्रश्न के लिए, मुझे "उचित" तरीके का पता नहीं है। कुछ तरीके हैं जिनसे मैं सोच सकता हूं। दोनों अंत तत्वों को संग्रहीत करते हैं। मुझे तत्वों को संग्रहीत किए बिना एक धारा को उल्टा करने का तरीका नहीं पता है।
यह पहला तरीका तत्वों को एक सरणी में संग्रहीत करता है और उन्हें रिवर्स ऑर्डर में एक स्ट्रीम में पढ़ता है। ध्यान दें कि चूंकि हम स्ट्रीम तत्वों के रनटाइम प्रकार को नहीं जानते हैं, इसलिए हम अनियंत्रित कलाकारों की आवश्यकता होने पर सरणी को ठीक से टाइप नहीं कर सकते हैं।
@SuppressWarnings("unchecked")
static <T> Stream<T> reverse(Stream<T> input) {
Object[] temp = input.toArray();
return (Stream<T>) IntStream.range(0, temp.length)
.mapToObj(i -> temp[temp.length - i - 1]);
}
एक अन्य तकनीक कलेक्टरों का उपयोग करके वस्तुओं को एक उलट सूची में जमा करती है। यह ArrayList
वस्तुओं के सामने बहुत सारे सम्मिलन करता है , इसलिए बहुत सारी नकल चल रही है।
Stream<T> input = ... ;
List<T> output =
input.collect(ArrayList::new,
(list, e) -> list.add(0, e),
(list1, list2) -> list1.addAll(0, list2));
यह संभव है कि किसी प्रकार के अनुकूलित डेटा संरचना का उपयोग करके अधिक कुशल रिवर्सल कलेक्टर लिखना संभव हो।
अद्यतन 2016-01-29
चूँकि इस सवाल पर हाल ही में थोड़ा ध्यान दिया गया है, मुझे लगता है कि मुझे अपने जवाब को अद्यतन करना चाहिए ताकि सामने वाले को समस्या का समाधान करना पड़े ArrayList
। यह ओ (एन ^ 2) प्रतिलिपि की आवश्यकता वाले तत्वों की एक बड़ी संख्या के साथ बहुत ही अयोग्य होगा।
इसके ArrayDeque
बजाय उपयोग करना बेहतर होता है , जो सामने की ओर सम्मिलन का कुशलता से समर्थन करता है। एक छोटी सी शिकन यह है कि हम तीन-arg फॉर्म का उपयोग नहीं कर सकते हैं Stream.collect()
; इसके लिए आवश्यक है कि दूसरे arg की सामग्री को पहले arg में मिला दिया जाए, और इसमें कोई "add-all-at-front" बल्क नहीं है Deque
। इसके बजाय, हम addAll()
पहले आर्ग की सामग्री को दूसरे के अंत तक जोड़ने के लिए उपयोग करते हैं, और फिर हम दूसरे को वापस करते हैं। इसके उपयोग की आवश्यकता हैCollector.of()
फ़ैक्टरी विधि पड़ता है।
पूरा कोड यह है:
Deque<String> output =
input.collect(Collector.of(
ArrayDeque::new,
(deq, t) -> deq.addFirst(t),
(d1, d2) -> { d2.addAll(d1); return d2; }));
परिणाम एक के Deque
बजाय एक है List
, लेकिन यह एक मुद्दे का ज्यादा नहीं होना चाहिए, क्योंकि यह आसानी से पुनरावृत्त या अब-उल्टे क्रम में प्रवाहित हो सकता है।
IntStream
नहीं.sorted(Comparator)
है; आपकोStream<Integer>
पहली बार वहां सेIntStream