java:用流实现向量加法



是否有一种优雅的方式来互操作两个流?

/**
*  e.g. add([1, -1, 5], [2, 3, 4]) -> [3, 2, 9]
*/
Stream<Integer> add(Stream<Integer> a, Stream<Integer> b)  {
//?
}

我不愿意收集两个流来做for循环中的事情,只是为了再次流式传输结果

Stream<Integer> add(Stream<Integer> a, Stream<Integer> b)  {
Iterator<Integer> i=a.iterator();
return b.map(bz-> i.hasNext() ?  bz + i.next() : bz);
}

我认为这个问题真正突出了为什么你可能不应该做你正在做的事情。

1。你添加了三对int,你使用Stream,所以你必须使用Integer。相对于操作来说,这是一个巨大的开销。

2。流的概念并不局限于有序的数据集。

因此,收集到一个列表是有意义的,因为你显式地操作一个有限有序的数据集。

List<Integer> la = a.collect( Collectors.toList());
List<Integer> lb = b.collect( Collectors.toList());
Stream<Integer> result = IntStream.range( 0, la.size() ).mapToObj( 
i -> la.get(i) && lb.get(j) 
);

使用a.t iterator()而不是列表可能更像流,因为您将不限于有限的数据集。

Iterator<Integer> ia = a.iterator();
Iterator<Integer> ib = b.iterator();
if( ! ia.hasNext() || ! ib.hasNext() ) return Stream.empty();
return Stream.iterate( 
ia.next() + ib.next(), 
last -> ia.hasNext() && ib.hasNext(), 
last -> ia.next() + ib.next() );

最新更新