Scala 流的分区

Scala 流的分区,scala,Scala,我不确定这是否可行,但我想根据流输出的某些条件对流进行分区。我想举个例子会有意义的 我将创建一组订单,我将对这些订单进行流式处理,因为实际用例是一个订单流,所以事先不知道下一个订单是什么,甚至不知道完整的订单列表: scala> case class Order(item : String, qty : Int, price : Double) defined class Order scala> val orders = List(Order("bike", 1, 23.34),

我不确定这是否可行,但我想根据流输出的某些条件对流进行分区。我想举个例子会有意义的

我将创建一组订单,我将对这些订单进行流式处理,因为实际用例是一个订单流,所以事先不知道下一个订单是什么,甚至不知道完整的订单列表:

scala> case class Order(item : String, qty : Int, price : Double)
defined class Order

scala> val orders = List(Order("bike", 1, 23.34), Order("book", 3, 2.34), Order("lamp", 1, 9.44), Order("bike", 1, 23.34))
orders: List[Order] = List(Order(bike,1,23.34), Order(book,3,2.34), Order(lamp,1,9.44), Order(bike,1,23.34))
现在,我想将这些订单划分/分组为一个包含重复订单的集合和另一个包含唯一订单的集合。因此,在上面的示例中,当我强制流时,它应该创建两个流:一个包含自行车的两个订单(因为它们是相同的),另一个包含所有其他订单的流

我尝试了以下方法:

创建分区函数:

scala> def matchOrders(o : Order, s : Stream[Order]) = s.contains(o)
matchOrders: (o: Order, s: Stream[Order])Boolean
然后尝试将此应用于流:

scala> val s : (Stream[Order], Stream[Order]) = orders.toStream.partition(matchOrders(_, s._1))

我得到了一个空指针异常,因为我猜
s._1
最初是空的??我不确定。我也尝试过其他方法,但进展不大。有没有一种方法可以实现这种分区?

这种方法无论如何都不起作用,因为第一个重复的
顺序
在您处理它的重复时可能已经转到了唯一的

最好的方法是创建一个
映射[Order,Boolean]
,它告诉您一个
订单
是否在原始订单列表中多次出现

val matchOrders = orders.groupBy(identity).mapValues(_.size > 1)
val s : (Stream[Order], Stream[Order]) = orders.toStream.partition(matchOrders(_))

请注意,只有在流完成后,才能知道订单没有重复项。因此,由于标准的
构造函数要求您知道流是否为空,因此它们似乎不够懒惰:您必须强制原始流甚至开始构建无重复流。当然,如果你这样做,赫尔德·佩雷拉的答案是适用的。

正如我所解释的,事先不知道整个顺序列表是什么,所以你不能像现在这样编写匹配顺序谓词。我创建上面的订单列表只是为了举个例子。但你确实对第一批货说得很好;我也想过。我想我可能需要创建某种递归流结构;我现在正在试验