(用较短版本的问题编辑)
我想用部分函数改变我的集合中的一些对象。Foreach 不允许这样做。我可以用收集来做到这一点,但是创建新收藏有副作用,我希望避免这种情况。
好的,所以我们正在对任何类型的集合中的数据进行变异。我一起输入了这个示例数据结构:
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 并在可能的情况下应用它,并在 a 中返回结果Some
。如果它不能,那么它就会变成None
,而不是MatchError
当你没有case _ => ...
.