如何創建隱式轉換器,以便此代碼
case class Cookie(name: String, value: String)
val cookies: Seq[Cookie] = ???
val cookieMap: Map[String, String] = cookies.toMap
會作業嗎?如何定義implicit ev: A <:< (K, V)?
uj5u.com熱心網友回復:
您可以這樣做:
cookies.iterator.map(c => c.name -> c.value).toMap
在單次迭代中進行轉換。你甚至可以說后面,如果你的擴展方法或某事,請隱藏。
或者您可以提供一個
implicit def Cookie2Tuple2(c: Cookie): (String, String) = c.name -> c.value
But,這可能會在代碼的其他意外部分中爆炸。
我個人會定義我自己的。
final case class Cookie(underlying: List[Cookie]) {
def toMap: Map[String, String] =
underlying.iterator.map(c => c.name -> c.value).toMap
}
uj5u.com熱心網友回復:
來自 Scala檔案:
A <:< B 的實體證明 A 是 B 的子型別。需要型別 A <:< B 的隱式引數對廣義約束 A <: B 進行編碼。
這意味著證據Cookie <:< (K, V)意味著 Cookie 是 (K,V) 的子類,這是不可能的。證據不是隱式轉換。
(你也可以閱讀:https : //stackoverflow.com/a/3427759/1206998)
然后,我查看了toMap中的實作 IterableOnce
def toMap[K, V](implicit ev: A <:< (K, V)): immutable.Map[K, V] =
immutable.Map.from(this.asInstanceOf[IterableOnce[(K, V)]])
如您所見,它將 iterable 轉換為元組的 iterableOnce,不執行集合項的轉換。因此,參賽作品必須是有效的(K,V)
所以你唯一能做的就是添加一個從Seq[Cookie]到的隱式轉換Map(String, String]
import scala.collection.breakOut // to directly convert to Map
case class Cookie(name: String, value: String)
implicit class Cookies(cookies: Seq[Cookie]) {
def toNameValueMap: Map[String, String] = {
cookies.map(c => (c.name, c.value))(breakout)
}
}
val cookies: Seq[Cookie] = List(Cookie("chocolate", "1.2"), Cookie("peanut", "1.6"))
val cookieMap: Map[String, String] = cookies.toNameValueMap
并且為了它的樂趣,這里是對應于您期望 toMap 能夠執行的操作的通用轉換方法:
implicit class SeqConversion[A](seq: Seq[A]) {
def convertToMap[K,V](getKey: A => K, getValue: A => V): Map[K,V] ={
seq.map(a => (getKey(a), getValue(a)))(breakOut)
}
}
cookies.convertToMap(_.name, _.value)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/344790.html
標籤:斯卡拉
上一篇:在Scala匿名函式中使用“_”的簡短規則讓我感到困惑
下一篇:OpenCV獲取矩陣的形狀
