/* package whatever; // don't place package name! */
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main
(String[] args
) { List
<List
<String
>> list1
= Arrays.
asList(Arrays.
asList("ABC",
"123",
"456"),
Arrays.
asList("DEF",
"234",
"567"),
Arrays.
asList("GHI",
"345",
"678")); List
<List
<String
>> list2
= Arrays.
asList(Arrays.
asList("ABC",
"789",
"012"),
Arrays.
asList("DEF",
"890",
"123"),
Arrays.
asList("GHI",
"901",
"234"));
List<List<String>> a = zip(list1.stream(), list2.stream(), (l1, l2) -> {
List<String> l = new ArrayList<>(l1);
l.addAll(l2.subList(1, l2.size()));
return l;
}).collect(Collectors.toList());
}
public static <A, B, C> Stream<C> zip(Stream<? extends A> a, Stream<? extends B> b,
BiFunction<? super A, ? super B, ? extends C> zipper) {
Objects.requireNonNull(zipper);
@SuppressWarnings("unchecked")
Spliterator<A> aSpliterator = (Spliterator<A>) Objects.requireNonNull(a).spliterator();
@SuppressWarnings("unchecked")
Spliterator<B> bSpliterator = (Spliterator<B>) Objects.requireNonNull(b).spliterator();
// Zipping looses DISTINCT and SORTED characteristics
int both = aSpliterator.characteristics() & bSpliterator.characteristics()
& ~(Spliterator.DISTINCT | Spliterator.SORTED);
int characteristics = both;
long zipSize = ((characteristics & Spliterator.SIZED) != 0)
? Math.
min(aSpliterator.
getExactSizeIfKnown(), bSpliterator.
getExactSizeIfKnown()) : -1;
Iterator<A> aIterator = Spliterators.iterator(aSpliterator);
Iterator<B> bIterator = Spliterators.iterator(bSpliterator);
Iterator<C> cIterator = new Iterator<C>() {
@Override
public boolean hasNext() {
return aIterator.hasNext() && bIterator.hasNext();
}
@Override
public C next() {
return zipper.apply(aIterator.next(), bIterator.next());
}
};
Spliterator<C> split = Spliterators.spliterator(cIterator, zipSize, characteristics);
return (a.isParallel() || b.isParallel()) ? StreamSupport.stream(split, true)
: StreamSupport.stream(split, false);
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKaW1wb3J0IGphdmEudXRpbC5TcGxpdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5TcGxpdGVyYXRvcnM7CmltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlGdW5jdGlvbjsKaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OwoKCgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQlMaXN0PExpc3Q8U3RyaW5nPj4gbGlzdDEgPSBBcnJheXMuYXNMaXN0KEFycmF5cy5hc0xpc3QoIkFCQyIsICIxMjMiLCAiNDU2IiksIEFycmF5cy5hc0xpc3QoIkRFRiIsICIyMzQiLCAiNTY3IiksCgkJCQlBcnJheXMuYXNMaXN0KCJHSEkiLCAiMzQ1IiwgIjY3OCIpKTsKCQlMaXN0PExpc3Q8U3RyaW5nPj4gbGlzdDIgPSBBcnJheXMuYXNMaXN0KEFycmF5cy5hc0xpc3QoIkFCQyIsICI3ODkiLCAiMDEyIiksIEFycmF5cy5hc0xpc3QoIkRFRiIsICI4OTAiLCAiMTIzIiksCgkJCQlBcnJheXMuYXNMaXN0KCJHSEkiLCAiOTAxIiwgIjIzNCIpKTsKCgkJTGlzdDxMaXN0PFN0cmluZz4+IGEgPSB6aXAobGlzdDEuc3RyZWFtKCksIGxpc3QyLnN0cmVhbSgpLCAobDEsIGwyKSAtPiB7CgkJCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDw+KGwxKTsKCQkJbC5hZGRBbGwobDIuc3ViTGlzdCgxLCBsMi5zaXplKCkpKTsKCQkJcmV0dXJuIGw7CgkJfSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKCQkKCQlTeXN0ZW0ub3V0LnByaW50bG4oYSk7Cgl9CgkKCQlwdWJsaWMgc3RhdGljIDxBLCBCLCBDPiBTdHJlYW08Qz4gemlwKFN0cmVhbTw/IGV4dGVuZHMgQT4gYSwgU3RyZWFtPD8gZXh0ZW5kcyBCPiBiLAoJCQlCaUZ1bmN0aW9uPD8gc3VwZXIgQSwgPyBzdXBlciBCLCA/IGV4dGVuZHMgQz4gemlwcGVyKSB7CgkJT2JqZWN0cy5yZXF1aXJlTm9uTnVsbCh6aXBwZXIpOwoJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQoJCVNwbGl0ZXJhdG9yPEE+IGFTcGxpdGVyYXRvciA9IChTcGxpdGVyYXRvcjxBPikgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChhKS5zcGxpdGVyYXRvcigpOwoJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQoJCVNwbGl0ZXJhdG9yPEI+IGJTcGxpdGVyYXRvciA9IChTcGxpdGVyYXRvcjxCPikgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChiKS5zcGxpdGVyYXRvcigpOwoKCQkvLyBaaXBwaW5nIGxvb3NlcyBESVNUSU5DVCBhbmQgU09SVEVEIGNoYXJhY3RlcmlzdGljcwoJCWludCBib3RoID0gYVNwbGl0ZXJhdG9yLmNoYXJhY3RlcmlzdGljcygpICYgYlNwbGl0ZXJhdG9yLmNoYXJhY3RlcmlzdGljcygpCgkJCQkmIH4oU3BsaXRlcmF0b3IuRElTVElOQ1QgfCBTcGxpdGVyYXRvci5TT1JURUQpOwoJCWludCBjaGFyYWN0ZXJpc3RpY3MgPSBib3RoOwoKCQlsb25nIHppcFNpemUgPSAoKGNoYXJhY3RlcmlzdGljcyAmIFNwbGl0ZXJhdG9yLlNJWkVEKSAhPSAwKQoJCQkJPyBNYXRoLm1pbihhU3BsaXRlcmF0b3IuZ2V0RXhhY3RTaXplSWZLbm93bigpLCBiU3BsaXRlcmF0b3IuZ2V0RXhhY3RTaXplSWZLbm93bigpKSA6IC0xOwoKCQlJdGVyYXRvcjxBPiBhSXRlcmF0b3IgPSBTcGxpdGVyYXRvcnMuaXRlcmF0b3IoYVNwbGl0ZXJhdG9yKTsKCQlJdGVyYXRvcjxCPiBiSXRlcmF0b3IgPSBTcGxpdGVyYXRvcnMuaXRlcmF0b3IoYlNwbGl0ZXJhdG9yKTsKCQlJdGVyYXRvcjxDPiBjSXRlcmF0b3IgPSBuZXcgSXRlcmF0b3I8Qz4oKSB7CgkJCUBPdmVycmlkZQoJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewoJCQkJcmV0dXJuIGFJdGVyYXRvci5oYXNOZXh0KCkgJiYgYkl0ZXJhdG9yLmhhc05leHQoKTsKCQkJfQoKCQkJQE92ZXJyaWRlCgkJCXB1YmxpYyBDIG5leHQoKSB7CgkJCQlyZXR1cm4gemlwcGVyLmFwcGx5KGFJdGVyYXRvci5uZXh0KCksIGJJdGVyYXRvci5uZXh0KCkpOwoJCQl9CgkJfTsKCgkJU3BsaXRlcmF0b3I8Qz4gc3BsaXQgPSBTcGxpdGVyYXRvcnMuc3BsaXRlcmF0b3IoY0l0ZXJhdG9yLCB6aXBTaXplLCBjaGFyYWN0ZXJpc3RpY3MpOwoJCXJldHVybiAoYS5pc1BhcmFsbGVsKCkgfHwgYi5pc1BhcmFsbGVsKCkpID8gU3RyZWFtU3VwcG9ydC5zdHJlYW0oc3BsaXQsIHRydWUpCgkJCQk6IFN0cmVhbVN1cHBvcnQuc3RyZWFtKHNwbGl0LCBmYWxzZSk7Cgl9CgoKfQ==
[[ABC, 123, 456, 789, 012], [DEF, 234, 567, 890, 123], [GHI, 345, 678, 901, 234]]