জাভা 8 ইলিমেন্ট কুকুরগুলিতে কপি কন্সট্রাক্টর বা ক্লোন পদ্ধতিটি মার্জিতভাবে এবং সংক্ষিপ্তভাবে কল করার জন্য একটি নতুন উপায় সরবরাহ করে: স্ট্রিম , ল্যাম্বডাস এবং সংগ্রহকারী ।
অনুলিপি নির্মাণকারী:
List<Dog> clonedDogs = dogs.stream().map(Dog::new).collect(toList());
অভিব্যক্তিটিকে Dog::newএকটি পদ্ধতি রেফারেন্স বলা হয় । এটি একটি ফাংশন অবজেক্ট তৈরি করে Dogযা একটি কনস্ট্রাক্টরকে কল করে যার উপর অন্য কুকুরটিকে যুক্তি হিসাবে গ্রহণ করে।
ক্লোন পদ্ধতি [1]:
List<Dog> clonedDogs = dogs.stream().map(d -> d.clone()).collect(toList());
ArrayListফলাফল হিসাবে একটি পেয়ে
অথবা, যদি আপনাকে ArrayListফিরে পেতে হয় (তবে আপনি পরে এটি সংশোধন করতে চান):
ArrayList<Dog> clonedDogs = dogs.stream().map(Dog::new).collect(toCollection(ArrayList::new));
জায়গায় তালিকা আপডেট করুন
আপনার যদি তালিকার মূল বিষয়বস্তু রাখার দরকার না হয় তবে আপনি dogsপরিবর্তে replaceAllপদ্ধতিটি ব্যবহার করতে পারেন এবং তালিকায় জায়গাটি আপডেট করতে পারেন :
dogs.replaceAll(Dog::new);
সমস্ত উদাহরণ ধরে নেওয়া import static java.util.stream.Collectors.*;।
জন্য কালেক্টর ArrayListগুলি
শেষ উদাহরণ থেকে সংগ্রহকারী একটি ব্যবহার পদ্ধতিতে তৈরি করা যেতে পারে। যেহেতু এটি করা যেমন একটি সাধারণ জিনিস আমি ব্যক্তিগতভাবে এটি সংক্ষিপ্ত এবং সুন্দর হতে পছন্দ করি। এটার মত:
ArrayList<Dog> clonedDogs = dogs.stream().map(d -> d.clone()).collect(toArrayList());
public static <T> Collector<T, ?, ArrayList<T>> toArrayList() {
return Collectors.toCollection(ArrayList::new);
}
[1] দ্রষ্টব্য CloneNotSupportedException:
এই সমাধানটির জন্য কাজ করার cloneপদ্ধতিটি Dog অবশ্যই ঘোষণা করে না যে এটি ছোঁড়ে CloneNotSupportedException। কারণটি হ'ল যুক্তিটি mapকোনও চেক করা ব্যতিক্রম নিক্ষেপ করার অনুমতি নেই।
এটার মত:
// Note: Method is public and returns Dog, not Object
@Override
public Dog clone() /* Note: No throws clause here */ { ...
তবে এটি কোনও বড় সমস্যা হওয়া উচিত নয়, যেহেতু এটি সর্বোত্তম অনুশীলন। ( উদাহরণস্বরূপ কার্যকর জাভা এই পরামর্শ দেয়))
এটি উল্লেখ করার জন্য গুস্তাভোর ধন্যবাদ
পুনশ্চ:
আপনি যদি এটি সুন্দর দেখতে পান তবে পরিবর্তে একই জিনিসটি করতে আপনি পদ্ধতিটির রেফারেন্স সিনট্যাক্সটি ব্যবহার করতে পারেন:
List<Dog> clonedDogs = dogs.stream().map(Dog::clone).collect(toList());