2016-04-24 39 views
0

在Seq中更新(或替换)项目的最佳实践是什么?在Scala中的不可变集合中更新(或替换)项目

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)) 

什么是最好的办法吗?

回答

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

地图也适用,并且可能会稍微容易一些比updated阅读:

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

thi的一个好处是除了可读性以外,您可以一次修改多个元素。

相关问题