我不确定这是否可行,但我想根据某些取决于流输出的条件对流进行分区。我认为通过一个例子就可以理解。
我将创建一堆我将流式传输的订单,因为实际用例是传入的订单流,因此预先不知道下一个订单是什么,甚至不知道完整的订单列表:
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
已经进入唯一的 Stream
了。
最好的方法是创建一个 Map[Order, Boolean]
,它会告诉您某个 Order
在原始订单列表中是否出现多次。
val matchOrders = orders.groupBy(identity).mapValues(_.size > 1)
val s : (Stream[Order], Stream[Order]) = orders.toStream.partition(matchOrders(_))
关于scala - 流的分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31899048/