2013-06-19 128 views
1

我是新来的斯卡拉,我正在努力与这个最愚蠢的事情。如何将List [String]转换为List [ServerAddress]?

我有一个列表[字符串],我想解析列表并产生一个新的列表[ServerAddress](ServerAddress是一个mongo的东西。我在概念上试图做的是将一个类型列表转换为不同的类型)。我该怎么做呢?我当前的尝试无法填充我的列表[ServerAddress]

scala> val seeds: List[String] = List("bobk-mbp.local", "bobk-mbp.local:27018") 
seeds: List[String] = List(bobk-mbp.local, bobk-mbp.local:27018) 

scala> val serverAddrs = List[ServerAddress]() 
serverAddrs: List[com.mongodb.casbah.Imports.ServerAddress] = List() 

scala> for (seed <- seeds) { new ServerAddress(seed) :: serverAddrs } 

scala> serverAddrs 
res12: List[com.mongodb.casbah.Imports.ServerAddress] = List() 

兄弟,你能否留意线索?

回答

6

你可以这样做:

val serverAddrs = seeds.map((s) => new ServerAddress(s)) 

编辑: 这里是一个更简洁的方式:

val serverAddrs = seeds.map(new ServerAddress(_)) 
+1

是不是在你的第二个例子是点错了?顺便说一句,如果ServerAddress是一个案例类,你可以做'种子映射ServerAddress' –

+0

@ om-nom-nom是的,你是对的。我解决了这个问题。 – bwroga

4

::运营商创建一个新的列表,而不是突变的旧人,所以你”重新创建一堆单元素列表然后丢弃它们。

惯用的方式做你像斯卡拉函数式语言需要的是只是映射列表:

val serverAddrs = seeds.map(s => new ServerAddress(s)) 
2

见@ Chuck的意见约::

这里的工作for表达这是map语法糖:

scala> val seeds: List[String] = List("bobk-mbp.local", "bobk-mbp.local:27018") 
seeds: List[String] = List(bobk-mbp.local, bobk-mbp.local:27018) 

scala> class ServerAddress(address: String) 
defined class ServerAddress 

scala> for(seed <- seeds) yield new ServerAddress(seed) 
res0: List[ServerAddress] = List([email protected], [email protected]) 
相关问题