Scala:相当于可变数据的collect + partial函数?

时间:2013-11-15 06:01:01

标签: scala

(用较短版本的问题编辑)

我想用部分函数改变集合中的一些对象。 Foreach不允许这样做。我可以用collect来做,但是对于创建新的集合有一个副作用,我宁愿避免。

1 个答案:

答案 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 _ => ...