在Scala中更新(或替换)不可变集合中的项目

时间:2016-04-24 10:35:54

标签: scala collections immutability scala-collections

在Seq中更新(或替换)项目的最佳做法是什么?

case class Minion(id: Int, name: String, motivation: Int)
val minions: Seq[Minion] = Seq(
  Minion(1, "Bob", 50),
  Minion(2, "Kevin", 50),
  Minion(3, "Stuart", 50))

我想获得新的收藏品

Seq(
  Minion(1, "Bob", 50),
  Minion(2, "Kevin", 50),
  Minion(3, "Stuart", 100))

最好的方法是什么?

2 个答案:

答案 0 :(得分:5)

使用updated

// first argument is index (zero-based) - so using 2 to replace 3rd item:
scala> minions.updated(2, Minion(3, "Stuart", 100))
res0: Seq[Minion] = List(Minion(1,Bob,50), Minion(2,Kevin,50), Minion(3,Stuart,100))

或者,不重复新Minion的未更改属性:

scala> minions.updated(2, minions(2).copy(motivation = 100))
res1: Seq[Minion] = List(Minion(1,Bob,50), Minion(2,Kevin,50), Minion(3,Stuart,100))

答案 1 :(得分:1)

地图也有效,可能比updated更容易阅读:

minions.map {
  case Minion(2, name, n) => Minion(2, name, 100)
  case m => m
}

除了可读性之外,这个优于updated的一个好处是你可以一次修改几个元素。