如何将Set [String]转换为Map [String,String]?

时间:2019-03-05 14:08:38

标签: scala

我想将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)) 
}

一个人如何优雅地实现这一目标?

2 个答案:

答案 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