[英]How to convert a Set[String] to Map[String, 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))
}
但是我收到以下錯誤:
type mismatch;
found : (Map[String,String], String) => scala.collection.immutable.Map[String,String]
required: (Object, Object) => Object
val res16 = x.fold(Map.empty[String, String]) { (p: Map[String, String], q: String) => p + (q -> doSomething(q)) }
^
如何優雅地實現這一目標?
您不需要fold
,只需在Set
上使用map
,然后將結果轉換為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])
獲得正確類型的表達式。
您可以使用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了解更多細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.