我想将String
转换为Set
,例如:
Map
但是出现以下错误:
val x: Set[String] = Set("asds", "reqrq", "dadas")
x.fold(Map.empty[String, String]) {
(p: Map[String, String], q: String) => p + (q -> doSomething(q))
}
一个人如何优雅地实现这一目标?
答案 0 :(得分:3)
您不需要任何fold
,只需在map
上使用Set
,然后转换结果toMap
。这是一个示例,其中doSomething
是_.toUpperCase
:
Set("a", "b").map(x => x -> x.toUpperCase).toMap
如果要避免构建中间集,可以使用breakOut
一步完成所有操作:
val y: Map[String, String] =
Set("a", "b").map(x => x -> x.toUpperCase)(collection.breakOut)
// `y` is now `Map(a -> A, b -> B)`
请注意,breakOut
所需的类型是由编译器从上下文中推断出来的。如果您没有将其分配给显式类型的局部变量,也没有将其传递给唯一确定所需类型的方法,则始终可以使用显式类型说明
(Set("a", "b").map(x => x -> x.toUpperCase)(breakOut): Map[String, String])
获得正确类型的表达式。
答案 1 :(得分:2)
您可以使用foldLeft
代替fold
:
val x: Set[String] = Set("asds", "reqrq", "dadas")
x.foldLeft(Map.empty[String, String]) { (p, q) =>
p + (q -> doSomething(q))
}
更多信息请查看Scala: fold vs foldLeft。