Поскольку я не могу представить себе использование zipping для коллекций, отличных от индексированных (списки), и я большой поклонник простоты, это было бы моим решением:
<A,B,C> Stream<C> zipped(List<A> lista, List<B> listb, BiFunction<A,B,C> zipper){
int shortestLength = Math.min(lista.size(),listb.size());
return IntStream.range(0,shortestLength).mapToObject( i -> {
return zipper.apply(lista.get(i), listb.get(i));
});
}