आप एक विधि है कि इस तरह, एक नया संग्रह में दो संग्रह बदल देती है बना सकते हैं:
public <T, U, R> Collection<R> singleCollectionOf(final Collection<T> collectionA, final Collection<U> collectionB, final Supplier<Collection<R>> supplier, final BiFunction<T, U, R> mapper) {
if (Objects.requireNonNull(collectionA).size() != Objects.requireNonNull(collectionB).size()) {
throw new IllegalArgumentException();
}
Objects.requireNonNull(supplier);
Objects.requireNonNull(mapper);
Iterator<T> iteratorA = collectionA.iterator();
Iterator<U> iteratorB = collectionB.iterator();
Collection<R> returnCollection = supplier.get();
while (iteratorA.hasNext() && iteratorB.hasNext()) {
returnCollection.add(mapper.apply(iteratorA.next(), iteratorB.next()));
}
return returnCollection;
}
यहां महत्वपूर्ण बात यह है कि यह नक्शा जाएगा प्राप्त iteratorA.next()
और iteratorB.next()
एक नई वस्तु में।
यह इस तरह कहा जाता है:
List<Integer> list1 = IntStream.range(0, 10).boxed().collect(Collectors.toList());
List<Integer> list2 = IntStream.range(0, 10).map(n -> n * n + 1).boxed().collect(Collectors.toList());
singleCollectionOf(list1, list2, ArrayList::new, Pair::new).stream().forEach(System.out::println);
अपने उदाहरण में यह होगा:
List<ObjectType3> lst3 = singleCollectionOf(lst1, lst2, ArrayList::new, ObjectType3::new);
कहाँ उदाहरण Pair::new
के लिए lamdda (t, u) -> new Pair(t, u)
के लिए एक आशुलिपि है।
क्या आप 'ऑब्जेक्ट टाइप 3' का वास्तविक कन्स्ट्रक्टर प्रदान कर सकते हैं? – skiwi
यहां स्ट्रीम का उपयोग क्यों करें? आपका मौजूदा पाश ठीक काम करता है और एक स्ट्रीम _less_ पठनीय – fge
@fge मुझे पता चलेगी। मुझे एक लाइन समाधान चाहिए। पठनीयता के बारे में, मेरी राय में यह केवल अभ्यास का सवाल है। मैं दिए गए समाधान के फ्लाई पर समझ सकता हूं। इस बारे में बताने के लिए शुक्रिया! –