जावा 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);
}
[१] नोट 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());