java 合并多个流,java – 合并两个流

我正在尝试实现一种方法,以根据值的比较器合并两个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)即使你可以对流进行排序,它也不能提供所需的结果.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值