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)