如何将List [String]转换为List [ServerAddress]?

时间:2013-06-19 17:59:06

标签: scala

我是Scala的新手,正在努力应对这种最愚蠢的事情。

我有一个List [String],我想解析列表并生成一个新的List [ServerAddress](ServerAddress是一个mongo的东西。我在概念上试图做的是将一个Type的List转换为另一个Type )。我该怎么做呢?我当前的尝试无法填充我的List [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()

兄弟,你能不知道吗?

3 个答案:

答案 0 :(得分:6)

你可以这样做:

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

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

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

答案 1 :(得分:4)

::运算符创建一个新列表而不是改变旧列表,因此您只需创建一堆单元素列表然后丢弃它们。

在Scala等函数式语言中执行所需操作的惯用方法就是映射列表:

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

答案 2 :(得分: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(ServerAddress@1985828e, ServerAddress@c3e45b9)