[英]Scala how to append or remove item in Seq
我有以下课程
case class User(userId: Int, userName: String, email: String,
password:
String) {
def this() = this(0, "", "", "")
}
case class Team(teamId: Int, teamName: String, teamOwner: Int,
teamMembers: Seq[User]) {
def this() = this(0, "", 0, Nil)
}
我想在teamMembers中添加或用户:Seq [User]。 我尝试了几种方法,例如:
Team.teamMembers :+ member
Team.teamMembers +: member
什么都没用:)。 请为我提供建议,该如何从teamMembers中添加或删除项目:Seq [User]。
提前致谢!
创建一个返回添加了成员的新团队的操作,例如
我认为其他代码的问题是您正在尝试更改不可变变量。 案例类团队中的teamMember字段是一个不可变的val,因此使用操作对其进行更改不会更改其中包含的值-它只会返回带有附加值的新序列,但不会影响该序列类团队。
case class Team(teamId: Int, teamName: String, teamOwner: Int, teamMembers: Seq[User]) {
def this() = this(0, "", 0, Nil)
// Operation returns a new Team object which has all elements of the previous team plus an additional member appended to the team members.
def addMember(member: User) : Team = Team(teamId, teamName, teamOwner, teamMembers :+ member)
}
您没有提到要使用哪个Seq。
如果是scala.collection.mutable.Seq
,则可以添加到此Seq。
但是,大多数更改都使用不可变的。Seq是Scala的默认设置。 这意味着您不能添加它,但是您可以创建一个包含所有项目和新项目的新项目。
开箱即用,您可以像这样使用scala-
val team =Team(0,"", 0, Seq[User]())
val member = User(0, "","", "")
val teamWithNewMemebr = team.copy(teamMembers = team.teamMembers :+ member)
但是,如果您有很多嵌套或必须做很多事情,这将变得非常丑陋。
要克服这种复杂的语法,您可以使用像scalaz这样的库,为您提供Lenses的 monocle
这是如何使用镜头的一个很好的例子http://eed3si9n.com/learning-scalaz/Lens.html
好吧, case classes
中的所有parameter attributes
默认case classes
都是immutable
的。
这样做是为了促进thread-safe
编程。 另外,应该注意的一件主要事情是,这在某种程度上也促进了OOP的原始思想(在被Java OOP转换之前,它类似于Smalltalk)。
好吧……国家与行为的分离。 所以...基本上Separation of state and behaviour
满足thread-safety
的理想情况。
我个人的爱好是-在case class
具有state
,并将所有behaviour
转移到companion object
。
case class User( userId: Int, userName: String, email: String, password: String )
object User {
def apply(): User = User( 0, "", "", "" )
}
case class Team( teamId: Int, teamName: String, teamOwner: Int, teamMembers: Seq[ User ] )
object Team {
def apply(): Team = Team( 0, "", 0, Nil )
// since addMember is a behavior, it belongs here.
// Also... since we are immutable... addMember name does not make much sense...
// Let's call it withMember
def withMember( team: Team, user: User ): Team = {
team.copy( teamMembers = team.teamMembers :+ user )
}
}
现在,您必须像这样使用它,
val user = User()
val team = Team()
val teamWithMember = Team.withMember( team, user )
但是...万一...(例如,在非常罕见的情况下),如果您“真的”想要(控制您的欲望人...控制)使其可变,则
case class Team( teamId: Int, teamName: String, teamOwner: Int, var teamMembers: Seq[ User ] )
object Team {
def apply(): Team = Team( 0, "", 0, Nil )
// since addMember is a behavior, it belongs here.
// Now we can keep name addMember
def addMember( team: Team, user: User ): Unit = {
team.teamMembers = team.teamMembers :+ user
}
}
像这样使用
val user = User()
val team = Team()
team.addMember( user )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.