Scala:如何将List[String]转为逗号分隔参数并构建对象列表?
问题解决方案
1. 解决withValues参数传递问题
假设withValues方法定义为接受可变参数(比如def withValues(args: String*): foo),你需要将List[String]转换为可变参数传递,Scala中可以通过:_*语法实现。直接遍历Map的键值对,比单独取key再查值更简洁安全:
new foo().withKey(key).withValues(values: _*)
如果不确定Map中所有键都存在对应值,可用getOrElse处理空值:
new foo().withKey(key).withValues(myMap.getOrElse(key, List.empty): _*)
2. 正确构建目标List
你原来用var和::=的方式完全错误——foreach返回Unit,相当于往列表里追加了无意义的Unit值,且Scala更推荐用函数式风格构建不可变集合:
def blah(myMap: Map[String, List[String]]): List[foo] = { myMap.map { case (key, values) => new foo().withKey(key).withValues(values: _*) }.toList }
这段代码会遍历Map的每一组键值对,生成对应的foo实例,最终返回你需要的List[foo]结构。
原代码的核心问题
var test = List()会被推断为List[Nothing],后续追加元素会触发类型不匹配错误test ::= myMap.keys.foreach(...)中foreach是副作用操作,返回Unit,无法生成你需要的foo实例列表- 用
map替代foreach,可直接生成目标集合,避免可变变量和副作用操作
内容的提问来源于stack exchange,提问作者pralxx
相关产品推荐
相关产品推荐

