বিপরীত উত্পন্ন করার নির্দিষ্ট প্রশ্নের জন্য 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
পরিবর্তে এটির পরিবর্তে ব্যবহার করা ভাল , যা সম্মুখভাগে সন্নিবেশকে দক্ষতার সাথে সমর্থন করে। একটি ছোট ছোট বলি হ'ল আমরা ত্রি-আরগ ফর্মটি ব্যবহার করতে পারি না Stream.collect()
; এটি দ্বিতীয় আরগের বিষয়বস্তুগুলি প্রথম আরগের সাথে একীভূত করা দরকার এবং সেখানে কোনও "অ্যাড-অল-এ-ফ্রন্ট" বাল্ক অপারেশন নেই Deque
। পরিবর্তে, আমরা ব্যবহার করিaddAll()
প্রথম আরগের সামগ্রীগুলি দ্বিতীয়টির শেষে যুক্ত এবং তারপরে আমরা দ্বিতীয়টি ফিরে আসি return এর জন্য 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