将值列表映射到Scala类中

时间:2017-08-13 22:13:43

标签: scala

我有两个班级:

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)

}

任何人都可以告诉我如何使用地图完成此操作,并解释我的错误尝试中会发生什么?

2 个答案:

答案 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)
}

我喜欢使用案例类,因为它们使构造非常容易,如上所述。我也只使用了一个列表,因为它是你使用的,所以我假设你想要一个列表。我很乐意回答您可能遇到的任何其他问题。