(用较短版本的问题编辑)
我想用部分函数改变集合中的一些对象。 Foreach不允许这样做。我可以用collect来做,但是对于创建新的集合有一个副作用,我宁愿避免。
答案 0 :(得分:2)
好的,我们正在改变任何类型的集合中的数据。我输入了这个示例数据结构:
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)
如果我们真的想省略case _ => Unit
,那么我们可以做一点Traversable Pimp:
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)
那是什么让这项工作? lift
函数接受PartialFunction并在可能的情况下应用它,并以Some
的形式返回结果。如果不能,那么它就变成None
,而不是MatchError
,而不是case _ => ...
。