How to interleave (merge) two Java 8 Streams?

前端 未结 6 1895
有刺的猬
有刺的猬 2020-12-16 16:43
 Stream a = Stream.of(\"one\", \"three\", \"five\");
 Stream b = Stream.of(\"two\", \"four\", \"six\");

What do I need

6条回答
  •  难免孤独
    2020-12-16 17:21

    One solution with Iterator

    final Iterator iterA = a.iterator();
    final Iterator iterB = b.iterator();
    
    final Iterator iter = new Iterator() {
      private final AtomicInteger idx = new AtomicInteger();
      @Override
      public boolean hasNext() { 
        return iterA.hasNext() || iterB.hasNext();
      }
      @Override
      public String next() {
        return idx.getAndIncrement() % 2 == 0 && iterA.hasNext() ? iterA.next() : iterB.next();
      }
    };
    
     // Create target Stream with StreamEx from: https://github.com/amaembo/streamex    
     StreamEx.of(iter).forEach(System.out::println);
    
     // Or Streams from Google Guava
     Streams.stream(iter).forEach(System.out::println);
    

    Or simply by the solution in abacus-util provided by me:

     AtomicInteger idx = new AtomicInteger();
     StreamEx.merge(a, b, (s1, s2) -> idx.getAndIncrement() % 2 == 0 ? Nth.FIRST : Nth.SECOND).forEach(Fn.println()); 
    

提交回复
热议问题