जावा 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());