我正在尝试实现一种方法,以根据值的比较器合并两个Streams中的值.
我有办法做到这一点,我迭代流并将值插入Stream.Builder,但我还没有弄清楚如何制作一个懒惰评估版本(许多流操作的方式),所以它也可以处理无限的流.
我想要它做的就是对输入数据执行单个合并传递,而不是对流进行排序(实际上,流可能会混乱;需要保留这种混乱).
static Stream merge(Stream first, Stream second, Comparator c)
我如何懒惰地合并这样的两个流?
如果我使用两个队列作为输入并将一些消费者作为输出来执行此操作,则会非常简单:
void merge(Queue first, Queue second, Consumer out, Comparator c){
while(!first.isEmpty() && !second.isEmpty()
if(c.compare(first.peek(), second.peek()) <= 0)
out.accept(first.remove());
else
out.accept(second.remove());
for(E e:first)
out.accept(e);
for(E e:second)
out.accept(e);
}
但我需要使用惰性评估和流来完成这项工作.
为了解决这些评论,这里有一些示例输入和结果:
例1:
merge(
Stream.of(1, 2, 3, 1, 2, 3),
Stream.of(2, 2, 3, 2, 2, 2),
Comparator.naturalOrder()
);
将返回一个将产生此序列的流:
1, 2, 2, 2, 3, 3, 1, 2, 2, 2, 2, 3
例2:
merge(
Stream.iterate(5, i->i-1),
Stream.iterate(1, i->i+1),
Comparator.naturalOrder()
);
将返回一个无限的(好的,一个INT_MAX 5项)流,它将产生序列:
1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0, -1 ...
正如你所看到的,这不仅仅是concat(第一,第二).sort(),因为(a)你不能对无限流进行排序,并且(b)即使你可以对流进行排序,它也不能提供所需的结果.