新scala所以缺少列表基本。
我试图列出以下类
case class Person (val name: String, val age:Int, val email: String)
如何创建Person类的列表不可变列表?
我试过了: -
val list: List[Person] = List(Person("",0,"")) // compilation ok
list.::(person) // compile ok
但是当我检查大小时它是1.它应该是2.我也不会在列表中看到添加的人。
请告诉我如何制作人员类列表,插入新人,然后检索人员,无论是年龄,姓名,电子邮件还是索引。
请不要将我推荐给api doc http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List
很难理解:(
答案 0 :(得分:4)
试试这个。
val list2 = list.::(person)
记住list
是不可变的。
list2
的大小应为2.
答案 1 :(得分:2)
记住上述不可变列表,
case class Person (val name: String = "",
val age:Int = 0,
val email: String = "")
(请注意,您可以为每个字段设置构造默认值)和
val list: List[Person] = List(Person("",0,"")) // compilation ok
我们也可以使用List[Person]
连接运算符List
构建第二个++
,如下所示,
val list2 = list ++ List(Person(age=1))
list2: List(Person(,0,), Person(,1,))
要按照给定的标准审核Person
,例如在此示例中,age
,请按以下方式考虑collect
,
val list3 = list2.collect { case p@Person(_, age, _) if age == 1 => p }
List[Person] = List(Person(,1,))
在这里,我们提取感兴趣的字段age
,并检查条件(是否等于1),因此我们选择保持条件的list2
中的条目;为了传递这样的条目,我们在每个p
实例上使用绑定Person
;也许更多的规范(和不必要的重复)方法
val list3 = list2.collect {
case Person(name, age, email) if age == 1 => Person(name, age, email) }
类似的方法依赖于filter
,如下所示,
list2.filter(p => p.age == 1)
有了理解,就像这样
for ( p@Person(n, a, e) <- list2 if a == 1 ) yield p
在条目列表上定义选择的更详细的方法包括定义一个方法,该方法将谓词作为参数并针对每个条目对其进行评估;另外,为了便于使用,这可以封装在一个隐式类中;因此,请考虑这个例子,
implicit class PersonsOps( val persons: List[Person] ) extends AnyVal {
def select(pred: Person => Boolean) = persons.filter(pred)
}
因此我们可以在byAge
的调用中定义一个匿名函数,即(x: Person) => x.age == 1
;因此
list2.select( (x: Person) => x.age == 1 )
或等效
list2.select( _.age == 1 )
请注意,此说明性示例中select
和filter
是等效的或可互换的,但select
可以通过其他要求进行丰富/扩展。
答案 2 :(得分:1)
正如Soumya Simanta所说,您有一个不可变列表,因此您必须将List
运算符返回的::
分配给新的val
。顺便说一句,您可以使用以下符号
val list2 = person :: list
相当于
val list2 = list.::(person)
要获取Person
个实例的信息,您可以使用以下行:
list2 foreach { p: Person => println(p.email) }
foreach
是List
的一种方法。它将一个函数(例如{ p: Person => println(p.email) }
)应用于列表的所有元素。
答案 3 :(得分:0)
list.::(person)
检索包含两个元素的新列表:旧元素和新元素。但是,该操作不会更改名为list的列表。试试这个:
var list: List[Person] = List(Person("",0,"")) // compilation ok
list = list.::(person) // compile ok