2017-05-22 56 views
3

示例;如何添加两个IntStreams元素?

IntStream a = create(3, 1); // => [0,0,1] 
IntStream b = create(5, 2); // => [0,0,0,0,2] 

第一流给出[0,0,1,0,0,1...]无限流和[0,0,0,0,2,0,0,0,0,2,...]第二无限流。

结果流是ri = ai + bi,这意味着我只想从每个流中获取相同位置的元素总和。

这在Java中可能吗?

+1

实现一个'Spliterator'显然是最好的方法:https://stackoverflow.com/q/30685623/1896169 – Justin

+0

什么是'创建'? –

+0

@YCF_L。这在问题中已清楚解释。 –

回答

2

您可以使用番石榴的Streams.zip()帮手:

IntStream sum(IntStream a, IntStream b) { 
    return Streams.zip(a.boxed(), b.boxed(), Integer::sum) 
      .map(Integer::intValue); 
} 
1

您可以定义自己的Spliterator稍后从它创建一个流。

import java.util.Comparator; 
import java.util.Spliterators; 
import java.util.function.IntConsumer; 

public class SumSpliterator extends Spliterators.AbstractIntSpliterator { 
    private OfInt aSplit; 
    private OfInt bSplit; 

    SumSpliterator(OfInt a, OfInt b) { 
     super(Math.min(a.estimateSize(), b.estimateSize()), Spliterator.ORDERED); 
     aSplit = a; 
     bSplit = b; 
    } 

    @Override 
    public boolean tryAdvance(IntConsumer action) { 
     SummingConsumer consumer = new SummingConsumer(); 
     if (aSplit.tryAdvance(consumer) && bSplit.tryAdvance(consumer)) { 
      action.accept(consumer.result); 
      return true; 
     } 
     return false; 
    } 

    static class SummingConsumer implements IntConsumer { 
     int result; 
     @Override 
     public void accept(int value) { 
      result += value; 
     } 
    } 
} 

然后创建一个流并检查结果

IntStream a = //create stream a 
IntStream b = //create stream b 
SumSpliterator spliterator = new SumSpliterator(a.spliterator(), b.spliterator()); 
Stream<Integer> stream = StreamSupport.stream(spliterator, false); 
stream.limit(20).forEach(System.out::println); 
+1

我会使用'Math.min(a.estimateSize(),b.estimateSize())'作为估计的大小...... – Holger