fork(3) download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.Objects;
  8. import java.util.Spliterator;
  9. import java.util.Spliterators;
  10. import java.util.function.BiFunction;
  11. import java.util.stream.Collectors;
  12. import java.util.stream.Stream;
  13. import java.util.stream.StreamSupport;
  14.  
  15.  
  16.  
  17. /* Name of the class has to be "Main" only if the class is public. */
  18. class Ideone
  19. {
  20. public static void main(String[] args) {
  21. List<List<String>> list1 = Arrays.asList(Arrays.asList("ABC", "123", "456"), Arrays.asList("DEF", "234", "567"),
  22. Arrays.asList("GHI", "345", "678"));
  23. List<List<String>> list2 = Arrays.asList(Arrays.asList("ABC", "789", "012"), Arrays.asList("DEF", "890", "123"),
  24. Arrays.asList("GHI", "901", "234"));
  25.  
  26. List<List<String>> a = zip(list1.stream(), list2.stream(), (l1, l2) -> {
  27. List<String> l = new ArrayList<>(l1);
  28. l.addAll(l2.subList(1, l2.size()));
  29. return l;
  30. }).collect(Collectors.toList());
  31.  
  32. System.out.println(a);
  33. }
  34.  
  35. public static <A, B, C> Stream<C> zip(Stream<? extends A> a, Stream<? extends B> b,
  36. BiFunction<? super A, ? super B, ? extends C> zipper) {
  37. Objects.requireNonNull(zipper);
  38. @SuppressWarnings("unchecked")
  39. Spliterator<A> aSpliterator = (Spliterator<A>) Objects.requireNonNull(a).spliterator();
  40. @SuppressWarnings("unchecked")
  41. Spliterator<B> bSpliterator = (Spliterator<B>) Objects.requireNonNull(b).spliterator();
  42.  
  43. // Zipping looses DISTINCT and SORTED characteristics
  44. int both = aSpliterator.characteristics() & bSpliterator.characteristics()
  45. & ~(Spliterator.DISTINCT | Spliterator.SORTED);
  46. int characteristics = both;
  47.  
  48. long zipSize = ((characteristics & Spliterator.SIZED) != 0)
  49. ? Math.min(aSpliterator.getExactSizeIfKnown(), bSpliterator.getExactSizeIfKnown()) : -1;
  50.  
  51. Iterator<A> aIterator = Spliterators.iterator(aSpliterator);
  52. Iterator<B> bIterator = Spliterators.iterator(bSpliterator);
  53. Iterator<C> cIterator = new Iterator<C>() {
  54. @Override
  55. public boolean hasNext() {
  56. return aIterator.hasNext() && bIterator.hasNext();
  57. }
  58.  
  59. @Override
  60. public C next() {
  61. return zipper.apply(aIterator.next(), bIterator.next());
  62. }
  63. };
  64.  
  65. Spliterator<C> split = Spliterators.spliterator(cIterator, zipSize, characteristics);
  66. return (a.isParallel() || b.isParallel()) ? StreamSupport.stream(split, true)
  67. : StreamSupport.stream(split, false);
  68. }
  69.  
  70.  
  71. }
Success #stdin #stdout 0.2s 320832KB
stdin
Standard input is empty
stdout
[[ABC, 123, 456, 789, 012], [DEF, 234, 567, 890, 123], [GHI, 345, 678, 901, 234]]