scala - 流的分区

标签 scala

我不确定这是否可行,但我想根据某些取决于流输出的条件对流进行分区。我认为通过一个例子就可以理解。

我将创建一堆我将流式传输的订单,因为实际用例是传入的订单流,因此预先不知道下一个订单是什么,甚至不知道完整的订单列表:

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/

相关文章:

scala - 如何更改 SBT 放置测试资源的目录?

scala - 当函数具有参数的先决条件时,返回 Either/Option/Try/Or 是否被视为可行/惯用的方法?

scala - Play 项目在 IntelliJ IDEA 中编译,但所有导入的 Java 类都是红色的(= 未解析)?

scala - 如何使用适当的线程池调整 Play Framework 应用程序?

scala - 为什么 Scala List[Int].contains 接受 Option[Int]?

scala - Spark 窗口分区功能将永远完成

scala - 编译器错误? java.lang.ClassCastException : scala. collection.mutable.WrappedArray$ofRef 无法转换为 java.lang.Integer

java - 将 java enum 转换为 scala Enumeration 以进行 json4s 序列化

java - Scala NoClassDefFoundError

scala - 为什么 future 的例子不起作用?