These code snippets do the job:
Solution 1 (simplest approach):
public static Collection<Integer> sumCollectionElements(Collection<Integer> L1, Collection<Integer> L2) {
final Iterator<Integer> iterator = L2.iterator();
return L1.stream()
.limit(Math.min(L1.size(), L2.size()))
.map(integer -> integer + iterator.next())
.collect(Collectors.toList());
}
Solution 2 (more general approach -> gist):
public static <A, B, C> Stream<C> zip(Stream<A> streamA, Stream<B> streamB, BiFunction<A, B, C> zipper) {
final Iterator<A> iteratorA = streamA.iterator();
final Iterator<B> iteratorB = streamB.iterator();
final Iterator<C> mergedIterator = new Iterator<C>() {
@Override
public boolean hasNext() {
return iteratorA.hasNext() && iteratorB.hasNext();
}
@Override
public C next() {
return zipper.apply(iteratorA.next(), iteratorB.next());
}
};
return iteratorToFiniteStream(mergedIterator);
}
public static <T> Stream<T> iteratorToFiniteStream(Iterator<T> iterator) {
final Iterable<T> iterable = () -> iterator;
return StreamSupport.stream(iterable.spliterator(), false);
}