Scala:相当于collect+;可变数据的部分函数?
(用问题的较短版本编辑)Scala:相当于collect+;可变数据的部分函数?,scala,Scala,(用问题的较短版本编辑) 我想用一个分部函数对集合中的某些对象进行变异。Foreach不允许这样。我可以用collect来做,但是在创建新集合时会产生副作用,我更愿意避免这种副作用。好的,所以我们在任何类型的集合中变异数据。我键入了以下示例数据结构: case class StringData(var value: String) case class IntData(var value: Int) val list = Seq(StringData("something"), IntData
我想用一个分部函数对集合中的某些对象进行变异。Foreach不允许这样。我可以用collect来做,但是在创建新集合时会产生副作用,我更愿意避免这种副作用。好的,所以我们在任何类型的集合中变异数据。我键入了以下示例数据结构:
case class StringData(var value: String)
case class IntData(var value: Int)
val list = Seq(StringData("something"), IntData(1), IntData(2), IntData(3))
因此,内置的方法是使用foreach
和两种情况:
list.foreach {
case i: IntData => i.value = i.value + 1
case _ => Unit
}
list.foreach(println)
// StringData(something)
// IntData(2)
// IntData(3)
// IntData(4)
如果我们真的想省略大小写单元
,那么我们可以做一些可遍历的操作:
那么,是什么让这一切起作用呢?
lift
函数接受PartialFunction并在可能的情况下应用它,返回结果为Some
。如果不能,那么它只会变成None
,而不是当您没有案例时发生的匹配错误
。
您使用的是哪个可变集合?您实际上不能筛选可变集合(因为删除这样的集合可能比创建新集合花费更多的时间)。您可以使用transform
方法作为map
方法的等效方法来对原始集合进行变异。我实际上使用的是可变对象的集合(集合本身是否可变对于我的问题并不重要),我的意图是用一个分部函数来改变集合中的一些对象。很抱歉,如果这在原始帖子中不清楚的话。@user2052791是的,您的评论对理解您的问题有很大帮助。也许你可以用一个更清晰的问题来编辑你的问题,这样将来的读者就可以更容易地理解它。谢谢,我怀疑,如果不能用现有的类来做这件事,那么做一点拉皮条就是最好的方法。谢谢你列出代码。
implicit class TraversableExtension[T](collection: Traversable[T]) {
def foreachPf(pf: PartialFunction[T, Unit]) = collection.foreach(pf.lift)
}
list.foreachPf { case i: IntData => i.value = i.value + 1 }
list.foreach(println)
// StringData(something)
// IntData(2)
// IntData(3)
// IntData(4)