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中可能嗎?
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中可能嗎?
您可以使用番石榴的Streams.zip()
幫手:
IntStream sum(IntStream a, IntStream b) {
return Streams.zip(a.boxed(), b.boxed(), Integer::sum)
.map(Integer::intValue);
}
您可以定義自己的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);
我會使用'Math.min(a.estimateSize(),b.estimateSize())'作爲估計的大小...... – Holger
實現一個'Spliterator'顯然是最好的方法:https://stackoverflow.com/q/30685623/1896169 – Justin
什麼是'創建'? –
@YCF_L。這在問題中已清楚解釋。 –