对于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文档http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List
很难理解:
发布于 2015-02-17 14:51:10
正如Simanta所说,您有一个不可变的列表,因此您必须将::操作符返回的::分配给一个新的val。顺便说一句,您可以使用以下符号
val list2 = person :: list这相当于
val list2 = list.::(person)要获取Person实例的信息,可以使用以下行:
list2 foreach { p: Person => println(p.email) }foreach是List的一种方法。它将一个函数(例如{ p: Person => println(p.email) })应用于列表中的所有元素。
发布于 2015-02-17 14:35:34
尝尝这个。
val list2 = list.::(person)记住,list是不可变的。list2应该有2码。
发布于 2015-02-17 14:50:21
记住前面提到的不可变的列表,
case class Person (val name: String = "",
val age:Int = 0,
val email: String = "")(注意,可以将构造默认值设置为每个字段)
val list: List[Person] = List(Person("",0,"")) // compilation ok我们还可以使用List[Person]连接操作符++构造第二个++,如下所示,
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中选择了那些保持条件的条目;为了传递这些条目,我们对每个Person实例使用了一个绑定p;也许会有更规范(不必要的重复)方法。
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可以通过额外的需求得到丰富/扩展。
https://stackoverflow.com/questions/28563750
复制相似问题