2

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

我想用部分函数改变我的集合中的一些对象。Foreach 不允许这样做。我可以用收集来做到这一点,但是创建新收藏有副作用,我希望避免这种情况。

4

1 回答 1

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 并在可能的情况下应用它,并在 a 中返回结果Some。如果它不能,那么它就会变成None,而不是MatchError当你没有case _ => ....

于 2013-11-16T01:27:51.793 回答