Sie könnten eine Methode erstellen, die zwei Sammlungen in eine neue Sammlung verwandelt, wie folgt aus:
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;
}
Der wichtige Teil hier ist, dass es die erhaltene Karte wird iteratorA.next()
und iteratorB.next()
in ein neues Objekt.
Es wird wie folgt aufgerufen:
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);
In Ihrem Beispiel wäre es:
List<ObjectType3> lst3 = singleCollectionOf(lst1, lst2, ArrayList::new, ObjectType3::new);
Wo zum Beispiel Pair::new
ist eine Abkürzung für die lamdda (t, u) -> new Pair(t, u)
.
Können Sie den eigentlichen Konstruktor von 'ObjectType3' bereitstellen? – skiwi
Warum Streams hier verwenden? Ihre vorhandene Schleife funktioniert gut und ein Stream wird _less_ lesbar – fge
@fge ich weiß. Ich möchte eine Single-Line-Lösung. Zur Lesbarkeit ist es meiner Meinung nach nur eine Frage der Übung. Ich kann die gegebene Lösung im Handumdrehen verstehen. Danke, dass du darauf hingewiesen hast! –