আপনি যদি স্ট্রিম.কম্যাট এবং স্ট্রিম.ওফের জন্য স্থিতিশীল আমদানি যুক্ত করেন তবে প্রথম উদাহরণটি নীচে লেখা যেতে পারে:
Stream<Foo> stream = concat(stream1, concat(stream2, of(element)));
আমদানি হচ্ছে স্ট্যাটিক পদ্ধতি জেনেরিক নামের সাথে কোডটি পড়া এবং বজায় রাখা (করা কঠিন হয়ে ঘটাতে পারে নামস্থান দূষণ )। সুতরাং, আরও অর্থবহ নাম সহ নিজের স্ট্যাটিক পদ্ধতি তৈরি করা ভাল । তবে, বিক্ষোভের জন্য আমি এই নামের সাথে আঁকড়ে থাকব।
public static <T> Stream<T> concat(Stream<? extends T> lhs, Stream<? extends T> rhs) {
return Stream.concat(lhs, rhs);
}
public static <T> Stream<T> concat(Stream<? extends T> lhs, T rhs) {
return Stream.concat(lhs, Stream.of(rhs));
}
এই দুটি স্থিতিশীল পদ্ধতিতে (স্ট্যাটিক আমদানির সাথে optionচ্ছিকভাবে) দুটি উদাহরণ নিম্নরূপ লেখা যেতে পারে:
Stream<Foo> stream = concat(stream1, concat(stream2, element));
Stream<Foo> stream = concat(
concat(stream1.filter(x -> x!=0), stream2).filter(x -> x!=1),
element)
.filter(x -> x!=2);
কোডটি এখন উল্লেখযোগ্যভাবে খাটো। তবে, আমি সম্মত হই যে পাঠযোগ্যতার উন্নতি হয়নি। সুতরাং আমি অন্য একটি সমাধান আছে।
অনেক পরিস্থিতিতে, সংগ্রাহকরা স্রোতের কার্যকারিতা বাড়াতে ব্যবহার করতে পারেন । নীচে দুটি সংগ্রাহক থাকায়, দুটি উদাহরণ নীচে লেখা যেতে পারে:
Stream<Foo> stream = stream1.collect(concat(stream2)).collect(concat(element));
Stream<Foo> stream = stream1
.filter(x -> x!=0)
.collect(concat(stream2))
.filter(x -> x!=1)
.collect(concat(element))
.filter(x -> x!=2);
আপনার পছন্দসই বাক্য গঠন এবং উপরের সিনট্যাক্সের মধ্যে কেবলমাত্র পার্থক্য হ'ল আপনাকে সংগ্রহ (কনক্যাট (...)) দিয়ে কনক্যাট (...) প্রতিস্থাপন করতে হবে । দুটি স্থিতিশীল পদ্ধতি নিম্নলিখিত হিসাবে প্রয়োগ করা যেতে পারে (স্থির আমদানির সাথে সংযোজনে বিকল্পভাবে ব্যবহৃত হয়):
private static <T,A,R,S> Collector<T,?,S> combine(Collector<T,A,R> collector, Function<? super R, ? extends S> function) {
return Collector.of(
collector.supplier(),
collector.accumulator(),
collector.combiner(),
collector.finisher().andThen(function));
}
public static <T> Collector<T,?,Stream<T>> concat(Stream<? extends T> other) {
return combine(Collectors.toList(),
list -> Stream.concat(list.stream(), other));
}
public static <T> Collector<T,?,Stream<T>> concat(T element) {
return concat(Stream.of(element));
}
অবশ্যই এই সমাধানটির একটি অপূর্ণতা রয়েছে যা উল্লেখ করা উচিত। সংগ্রহ হ'ল চূড়ান্ত ক্রিয়া যা প্রবাহের সমস্ত উপাদান গ্রাস করে। যে উপরে, সংগ্রাহক CONCAT কোন মধ্যবর্তী সৃষ্টি ArrayList প্রতিবার এটি শৃঙ্খল ব্যবহার করা হয়। উভয় অপারেশন আপনার প্রোগ্রামের আচরণের উপর উল্লেখযোগ্য প্রভাব ফেলতে পারে। তবে পাঠ্যতা যদি পারফরম্যান্সের চেয়ে বেশি গুরুত্বপূর্ণ হয় তবে এটি এখনও খুব সহায়ক পদ্ধতির হতে পারে।