जावा 11 में सामान्य संग्रह का नक्शा [डुप्लिकेट]
मैं एक जेनेरिक फ़ंक्शन लिखने का एक तरीका खोजने की कोशिश कर रहा हूं - संभवतः जेनेरिक का उपयोग नहीं करना - एक संग्रह पर मैप करने के लिए।
मान लीजिए कि मेरे पास A से B तक एक फ़ंक्शन है, मैं एक फ़ंक्शन लिखना चाहता हूं जो एक लेता है Collection<A>
और एक रिटर्न देता है Collection<B>
। ध्यान दें कि A और B सामान्य नहीं हैं, सामान्य पैटर्न को व्यक्त करने का एक तरीका है।
मेरे पास अब तक क्या है
public static Collection<Point> points2dToPoints(Collection<Point2D> points) {
return points.stream()
.map(Utils::point2dToPoint)
.collect(Collectors.toCollection(() -> points));
}
हालाँकि, मुझे इसमें एक प्रकार की त्रुटि मिलती है .collect
, क्योंकि स्पष्ट रूप से मैं चाहता हूं कि नया संग्रह हो, Collection<Point>
लेकिन मुझे यकीन नहीं है कि इसके लिए एक सप्लायर कैसे प्राप्त करें?
संपादित करें: मैं इस फ़ंक्शन को एक सामान्य तरीके से उपयोग करने में सक्षम होना चाहता हूं: यदि मैं इसे सेट करता हूं तो मुझे बदले में एक सेट मिलता है, लेकिन अगर मैं इसे एक सूची देता हूं तो मुझे बदले में एक सूची मिलती है। क्या ऐसा करना संभव है?
जवाब
सबसे अच्छा विकल्प ओवरक्लॉप्लेट नहीं करना है, और बस करना है:
public static Collection<Point> points2dToPoints(Collection<Point2D> points) {
return points.stream()
.map(Utils::point2dToPoint)
.collect(Collectors.toList());
}
लौटने एक ठोस इंटरफेस के लागू Collection
( जैसे, Collectors.toList()
जबकि बाहर से छुपा) कार्यान्वयन विवरण, ( यानी, होने Collection
विधि हस्ताक्षर में)।
हालाँकि, आप इसे पास करके अपनी विधि को और अधिक सामान्य बना सकते हैं - जैसे Supplier
- इंटरफ़ेस का कौन सा ठोस कार्यान्वयन Collection
आप इसे वापस करना चाहते हैं, अर्थात्
public static Collection<Point> points2dToPoints(Collection<Point2D> points, Supplier<Collection<Point>> aNew) {
return points.stream()
.map(Utils::point2dToPoint)
.collect(toCollection(aNew));
इस तरह आप उस ठोस Collection
कार्यान्वयन को पारित कर सकते हैं जो वापस आ जाएगा, उदाहरण के लिए:
points2dToPoints(.., ArrayList::new);
points2dToPoints(.., TreeSet::new);
के Collectors.toCollection(() -> points)
साथ बयान बदलें Collectors.toList()
।
डेमो:
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
class Car {
String name;
public Car(String name) {
this.name = name;
}
@Override
public String toString() {
return "Car [name=" + name + "]";
}
}
class Book {
Car car;
public Book(Car car) {
this.car = car;
}
public Car getCar() {
return car;
}
}
public class Main {
public static void main(String[] args) {
// Test
Collection<Car> list = points2dToPoints(
List.of(new Book(new Car("Toyota")), new Book(new Car("Ford")), new Book(new Car("Suzuki"))));
list.forEach(System.out::println);
}
public static Collection<Car> points2dToPoints(Collection<Book> points) {
return points.stream().map(Book::getCar).collect(Collectors.toList());
}
}
आउटपुट:
Car [name=Toyota]
Car [name=Ford]
Car [name=Suzuki]