1

我是 Scala 的新手,正在为这个最愚蠢的事情而苦苦挣扎。

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

大哥,能不能给点线索?

4

3 回答 3

6

你可以这样做:

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

编辑:这是一种更简洁的方法:

val serverAddrs = seeds.map(new ServerAddress(_))
于 2013-06-19T18:05:34.747 回答
4

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

在像 Scala 这样的函数式语言中做你想做的事情的惯用方法就是映射列表:

val serverAddrs = seeds.map( s => new ServerAddress(s) )
于 2013-06-19T18:06:05.817 回答
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)
于 2013-06-19T18:11:42.993 回答