首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala列表在列表中追加类并检索项

Scala列表在列表中追加类并检索项
EN

Stack Overflow用户
提问于 2015-02-17 14:31:42
回答 4查看 2.4K关注 0票数 0

对于scala来说是新的,所以缺少基本的列表。

我正在试着列一张下面课的清单

代码语言:javascript
复制
  case class Person (val name: String, val age:Int, val email: String)

如何使Person类的列表不可变?

我试过:-

代码语言:javascript
复制
val list: List[Person] = List(Person("",0,"")) // compilation ok
list.::(person) // compile ok

但是当我检查大小是1。应该是2。而且我没有看到列表中添加的人。

请让我知道如何做名单的人类,嵌入新的人,然后检索人,如果无论是年龄,姓名,电子邮件或索引以及。

请不要向我推荐api文档http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List

很难理解:

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-02-17 14:51:10

正如Simanta所说,您有一个不可变的列表,因此您必须将::操作符返回的::分配给一个新的val。顺便说一句,您可以使用以下符号

代码语言:javascript
复制
val list2 = person :: list

这相当于

代码语言:javascript
复制
val list2 = list.::(person)

要获取Person实例的信息,可以使用以下行:

代码语言:javascript
复制
list2 foreach { p: Person => println(p.email) }

foreachList的一种方法。它将一个函数(例如{ p: Person => println(p.email) })应用于列表中的所有元素。

票数 1
EN

Stack Overflow用户

发布于 2015-02-17 14:35:34

尝尝这个。

代码语言:javascript
复制
   val list2 = list.::(person)

记住,list是不可变的。list2应该有2码。

票数 4
EN

Stack Overflow用户

发布于 2015-02-17 14:50:21

记住前面提到的不可变的列表,

代码语言:javascript
复制
case class Person (val name: String = "", 
                   val age:Int = 0, 
                   val email: String = "")

(注意,可以将构造默认值设置为每个字段)

代码语言:javascript
复制
val list: List[Person] = List(Person("",0,"")) // compilation ok

我们还可以使用List[Person]连接操作符++构造第二个++,如下所示,

代码语言:javascript
复制
val list2 = list ++ List(Person(age=1)) 
list2: List(Person(,0,), Person(,1,))

要根据给定的标准检索Person,例如,在本例中,通过age检索collect,如下所示,

代码语言:javascript
复制
val list3 = list2.collect { case p@Person(_, age, _) if age == 1 => p }
List[Person] = List(Person(,1,))

在这里,我们提取感兴趣的字段age,并检查一个条件(它是否等于1),因此我们在list2中选择了那些保持条件的条目;为了传递这些条目,我们对每个Person实例使用了一个绑定p;也许会有更规范(不必要的重复)方法。

代码语言:javascript
复制
val list3 = list2.collect { 
  case Person(name, age, email) if age == 1 => Person(name, age, email) }

filter中,类似的方法如下所示,

代码语言:javascript
复制
list2.filter(p => p.age == 1)

为了理解,像这样

代码语言:javascript
复制
for ( p@Person(n, a, e) <- list2  if a == 1 ) yield p

定义条目列表上的选择的一种更详细的方法包括以谓词为参数并根据每个条目对其进行评估的方法的定义;此外,为了便于使用,可以将其封装在隐式类中;因此,请考虑下面的示例,

代码语言:javascript
复制
implicit class PersonsOps( val persons: List[Person] ) extends AnyVal {
  def select(pred: Person => Boolean) = persons.filter(pred)
}

因此我们可以在对byAge的调用中定义一个匿名函数,即(x: Person) => x.age == 1;因此

代码语言:javascript
复制
list2.select( (x: Person) => x.age == 1 )

或等量

代码语言:javascript
复制
list2.select( _.age == 1 )

注在这个示例中,selectfilter是等价的或可互换的,但是select可以通过额外的需求得到丰富/扩展。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28563750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档