繁体   English   中英

Scala如何在Seq中添加或删除项目

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM