簡體   English   中英

如何將Set [String]轉換為Map [String,String]?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM