You can use define Player as case class
and use compiler generated method copy
:
case class Player(name: String, onField: Boolean, draft: Int, perc: Int, height: Int, timePlayed: Int) {
override def toString: String = name
}
def play(team: List[Player]): List[Player] =
team map (p => p.copy(timePlayed = p.timePlayed + 1))
Also, as you see, constructor parameters are val
by default.
And you can define timeIncremented
in Player
and use it exactly as you want:
case class Player(name: String, onField: Boolean, draft: Int, perc: Int, height: Int, timePlayed: Int) {
override def toString: String = name
def timeIncremented: Player = copy(timePlayed = this.timePlayed + 1)
}
def play(team: List[Player]): List[Player] =
team map (_.timeIncremented)
For more complex cases you can take a look at lenses:
http://akisaarinen.fi/blog/2012/12/07/boilerplate-free-functional-lenses-for-scala/
Cleaner way to update nested structures