我是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()
兄弟,你能不知道吗?
答案 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)