2017-08-13 66 views
1

我有兩個類:問題映射值的列表到一個類斯卡拉

class Person(name: String) 
class Persons(people: List[Persons] 

我想創建一個接受一個字符串列表,同伴對象,讓每一個到一個人身上,並創建者目的。

object Persons { 
    def apply(people: List[String]) = new Persons(people.map(_ => new Person(_))) 
} 

但是,這是行不通的。事實證明,

people.map(_ => new Person(_)) 

是建立一個函數映射

List[(String) => Person] 

我設法得到的結果使用的理解後,我,但我不清楚什麼回事使用地圖。

def apply(ppl: List[String]): Persons = { 
    new Persons(for { 
    p <- ppl 
    person = new Person(p) 
} yield person) 

}

誰能告訴我如何做到這一點使用的地圖,也許解釋發生了什麼,我不正確的嘗試?

+1

'.map'採用參數1'A => B'的函數,而'_ => new Pe rson(_)'用2'_'定義一個arity 2的函數:或者'x => new Person(x)'或者'new Person(_)'('_'只用於'=> '忽略參數,不適用沒有命名)。 – cchantep

回答

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([email protected], [email protected], [email protected]) 

把它們放在一起:

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) 
+0

如果你像下面那樣使用case類,你甚至不需要新的,你可以用'people.map(People)'縮短它'我在下面寫了更多 –

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

我喜歡用case類,因爲它們使建築很容易像上面。我也只使用了一個列表,因爲它是你使用的,所以我假設你想要一個列表。我很樂意回答您可能遇到的任何其他問題。