我有两个班级:
class Person(name: String)
class Persons(people: List[Persons]
我想创建一个伴侣对象,它接受一个字符串列表,将每个字符串组成一个人,并创建一个Persons对象。
object Persons {
def apply(people: List[String]) = new Persons(people.map(_ => new Person(_)))
}
然而,这不起作用。事实证明
people.map(_ => new Person(_))
正在创建一个功能映射
List[(String) => Person]
我设法得到了我在使用for comprehension之后得到的结果,但是我不清楚使用map会发生什么。
def apply(ppl: List[String]): Persons = {
new Persons(for {
p <- ppl
person = new Person(p)
} yield person)
}
任何人都可以告诉我如何使用地图完成此操作,并解释我的错误尝试中会发生什么?
答案 0 :(得分:3)
正如您已经想到的那样,map(_ => new Person(_)
会创建一个函数列表:
val names = List("Dave", "Jenn", "Mike")
names.map(_ => new Person(_))
// res1: List[String => Person] = List(<function1>, <function1>, <function1>)
以下map
是您正在寻求的:
names.map(new Person(_))
// res2: List[Person] = List(Person@16cf05ef, Person@34d53f54, Person@5417d740)
将它们放在一起:
class Person(name: String)
class Persons(people: List[Person])
object Persons {
def apply(people: List[String]) = new Persons(people.map(new Person(_)))
}
val people = List(new Person("Dave"), new Person("Jenn"), new Person("Mike"))
val groupOfPeople1 = new Persons(people)
val names = List("Dave", "Jenn", "Mike")
val groupOfPeople2 = Persons(names)
答案 1 :(得分:2)
这样做可以满足您的需求吗?
https://scastie.scala-lang.org/SphW7AG7T7WgIGEXYN4U3w
case class Person(name: String)
class Persons(people: List[Person]) {
def getPeople: List[Person] = people
}
object Persons {
def apply(p: String*): Persons = new Persons(p.map(Person).toList)
def apply(p: List[String]): Persons = new Persons(p.map(Person))
}
val p = Persons("Steve", "Dave", "Bob")
val p2 = Persons(List("Steve", "Bob", "Dave"))
p.getPeople.foreach { person =>
println(person.name)
}
p2.getPeople.foreach { person =>
println(person.name)
}
我喜欢使用案例类,因为它们使构造非常容易,如上所述。我也只使用了一个列表,因为它是你使用的,所以我假设你想要一个列表。我很乐意回答您可能遇到的任何其他问题。