如何从现有地图派生出scala中的新不可变地图
How to derive a new Immutable map in scala out of an existing Map
我认为这会相对简单。
所以我会解释:
我有一个地图如下:这是我在 REPL 中尝试过的
scala> val entriesList = List(("tPolicyId" -> "MasterCard"), ("SSN" -> "0"), ("MasterCard" -> "3"));
entriesList: List[(String, String)] = List((tPolicyId,MasterCard), (US SSN,0), (MasterCard,3))
然后我将列表转换为地图,如下所示。
scala> val entriesMap = entriesList.toMap
entriesMap: scala.collection.immutable.Map[String,String] = Map(tPolicyId -> MasterCard,SSN -> 0, MasterCard -> 3)
到目前为止一切顺利。现在我想要完成的是一种迭代此 Map 的方法,有一个保护条件或谓词:如果我用来迭代此 Map 的函数遇到一个名为 tPolicyMap 的键,请 return 或者生成一个新的不可变映射,newMap 如下所示:
***newMap: scala.collection.immutable.Map[String,String] = Map(tPolicyId -> MasterCard)***
我认为这会很容易,下面是我迄今为止所有失败的尝试。
scala> val tPolicyMap = for (entry <- entriesMap if entry.contains("tPolicyId")) yield entry
<console>:10: error: value contains is not a member of (String, String)
val tPolicyMap = for (entry <- entriesMap if entry.contains("tPolicyId")) yield entry
^
scala> val tPolicyMap = for (entry <- entriesMap if ( entry.contains("tPolicyId"))) yield entry
<console>:10: error: value contains is not a member of (String, String)
val tPolicyMap = for (entry <- entriesMap if ( entry.contains("tPolicyId"))) yield entry
^
scala> val tPolicyMap = for (entry <- entriesMap if ( entry.contains("tPolicyId"))) yield (entry)
<console>:10: error: value contains is not a member of (String, String)
val tPolicyMap = for (entry <- entriesMap if ( entry.contains("tPolicyId"))) yield (entry)
^
scala> val tPolicyMap = for (entry <- entriesMap; if ( entry.contains("tPolicyId"))) yield (entry)
<console>:10: error: value contains is not a member of (String, String)
val tPolicyMap = for (entry <- entriesMap; if ( entry.contains("tPolicyId"))) yield (entry)
^
scala> val tPolicyMap = for (entry <- entriesMap; if ( entry contains("tPolicyId"))) yield (entry)
<console>:10: error: value contains is not a member of (String, String)
val tPolicyMap = for (entry <- entriesMap; if ( entry contains("tPolicyId"))) yield (entry)
^
scala> val tPolicyMap = for (entry <- entriesMap; if entry contains("tPolicyId"))) yield entry
<console>:1: error: illegal start of simple expression
val tPolicyMap = for (entry <- entriesMap; if entry contains("tPolicyId"))) yield entry
^
scala> val tPolicyMap = for (entry <- entriesMap; if entry contains("tPolicyId")) yield entry
<console>:10: error: value contains is not a member of (String, String)
val tPolicyMap = for (entry <- entriesMap; if entry contains("tPolicyId")) yield entry
^
scala> val tPolicyMap = for (entry <- entriesMap) yield entry
tPolicyMap: scala.collection.immutable.Map[String,String] = Map(tPolicyId -> MasterCard/Diner's Club U
S Number, US SSN -> 0, MasterCard -> 3)
scala> val tPolicyEntry = entriesMap.contains("tPolicyId")
tPolicyEntry: Boolean = true
scala> val tPolicyEntry = if (entriesMap.contains("tPolicyId")) yield entriesMap
<console>:1: error: illegal start of simple expression
val tPolicyEntry = if (entriesMap.contains("tPolicyId")) yield entriesMap
^
scala> val tPolicyEntry = for(entry <- entriesMap; if entry == "tPolicyId" yield entry
<console>:1: error: ')' expected but 'yield' found.
val tPolicyEntry = for(entry <- entriesMap; if entry == "tPolicyId" yield entry
^
scala> val tPolicyEntry = for(entry <- entriesMap; if entry == "tPolicyId") yield entry
<console>:10: warning: comparing values of types (String, String) and String using `==' will always yield false
val tPolicyEntry = for(entry <- entriesMap; if entry == "tPolicyId") yield entry
^
tPolicyEntry: scala.collection.immutable.Map[String,String] = Map()
scala> val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)) yield entry
<console>:1: error: illegal start of simple expression
val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)) yield entry
^
scala> val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)))) yield entry
<console>:1: error: illegal start of simple expression
val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)))) yield entry
^
scala> val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)) yield entry)
<console>:1: error: illegal start of simple expression
val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)) yield entry)
^
scala> val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)) yield entry))
<console>:1: error: illegal start of simple expression
val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)) yield entry))
^
scala> val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry) yield entry))
<console>:1: error: ')' expected but 'yield' found.
val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry) yield entry))
^
scala> val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry) yield entry)
<console>:1: error: ')' expected but 'yield' found.
val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry) yield entry)
如您所见,我尝试以各种组合方式使用 filter、yield、foreach、for 等,但均未成功。我还是不明白/
所以,我已经很努力了,我可能犯了一些根本性的幼稚错误。
如果有人能帮我弄清楚如何得到我想要的地图,我将不胜感激学习经验
提前致谢
就像
一样简单
entriesMap.filter { case (k, _) => k == "tPolicyId" }
//> res0: scala.collection.immutable.Map[String,String] = Map(tPolicyId -> MasterCard)
或者干脆
entriesMap filterKeys { _ == "tPolicyId" }
您正在考虑命令式(迭代、比较,如果匹配则执行此操作),而不是 Scala 不可变集合倾向于的更高级别:
// get looks up value from a map using the key (fast)
// will give you an Option[String] back -
// Some(value) if the key exists, None if it doesn't
tpPolicyMap.get("tPolicyId").fold[Map[String, String]](
// result for None - no "tPolicyId"-key in the source map
Map.empty
)(value =>
// found, create a new map with that entry
Map("tPolicyId" -> value)
)
filter
的解决方案很好。您也可以执行 collect
,如果您打算在 filter
之后执行 map
,这可能会很方便
entriesMap.collect{ case(k, v) if k == "tPolicyId" => (k, s"test${v}") } // example instead of plain (k, v)
// scala.collection.immutable.Map[String,String] = Map(tPolicyId -> testMasterCard)
等同于:
(entriesMap filterKeys { _ == "tPolicyId" }).map((kv) => (kv._1, s"test${kv._2}"))
// scala.collection.immutable.Map[String,String] = Map(tPolicyId -> testMasterCard)
我认为这会相对简单。 所以我会解释:
我有一个地图如下:这是我在 REPL 中尝试过的
scala> val entriesList = List(("tPolicyId" -> "MasterCard"), ("SSN" -> "0"), ("MasterCard" -> "3"));
entriesList: List[(String, String)] = List((tPolicyId,MasterCard), (US SSN,0), (MasterCard,3))
然后我将列表转换为地图,如下所示。
scala> val entriesMap = entriesList.toMap
entriesMap: scala.collection.immutable.Map[String,String] = Map(tPolicyId -> MasterCard,SSN -> 0, MasterCard -> 3)
到目前为止一切顺利。现在我想要完成的是一种迭代此 Map 的方法,有一个保护条件或谓词:如果我用来迭代此 Map 的函数遇到一个名为 tPolicyMap 的键,请 return 或者生成一个新的不可变映射,newMap 如下所示:
***newMap: scala.collection.immutable.Map[String,String] = Map(tPolicyId -> MasterCard)***
我认为这会很容易,下面是我迄今为止所有失败的尝试。
scala> val tPolicyMap = for (entry <- entriesMap if entry.contains("tPolicyId")) yield entry
<console>:10: error: value contains is not a member of (String, String)
val tPolicyMap = for (entry <- entriesMap if entry.contains("tPolicyId")) yield entry
^
scala> val tPolicyMap = for (entry <- entriesMap if ( entry.contains("tPolicyId"))) yield entry
<console>:10: error: value contains is not a member of (String, String)
val tPolicyMap = for (entry <- entriesMap if ( entry.contains("tPolicyId"))) yield entry
^
scala> val tPolicyMap = for (entry <- entriesMap if ( entry.contains("tPolicyId"))) yield (entry)
<console>:10: error: value contains is not a member of (String, String)
val tPolicyMap = for (entry <- entriesMap if ( entry.contains("tPolicyId"))) yield (entry)
^
scala> val tPolicyMap = for (entry <- entriesMap; if ( entry.contains("tPolicyId"))) yield (entry)
<console>:10: error: value contains is not a member of (String, String)
val tPolicyMap = for (entry <- entriesMap; if ( entry.contains("tPolicyId"))) yield (entry)
^
scala> val tPolicyMap = for (entry <- entriesMap; if ( entry contains("tPolicyId"))) yield (entry)
<console>:10: error: value contains is not a member of (String, String)
val tPolicyMap = for (entry <- entriesMap; if ( entry contains("tPolicyId"))) yield (entry)
^
scala> val tPolicyMap = for (entry <- entriesMap; if entry contains("tPolicyId"))) yield entry
<console>:1: error: illegal start of simple expression
val tPolicyMap = for (entry <- entriesMap; if entry contains("tPolicyId"))) yield entry
^
scala> val tPolicyMap = for (entry <- entriesMap; if entry contains("tPolicyId")) yield entry
<console>:10: error: value contains is not a member of (String, String)
val tPolicyMap = for (entry <- entriesMap; if entry contains("tPolicyId")) yield entry
^
scala> val tPolicyMap = for (entry <- entriesMap) yield entry
tPolicyMap: scala.collection.immutable.Map[String,String] = Map(tPolicyId -> MasterCard/Diner's Club U
S Number, US SSN -> 0, MasterCard -> 3)
scala> val tPolicyEntry = entriesMap.contains("tPolicyId")
tPolicyEntry: Boolean = true
scala> val tPolicyEntry = if (entriesMap.contains("tPolicyId")) yield entriesMap
<console>:1: error: illegal start of simple expression
val tPolicyEntry = if (entriesMap.contains("tPolicyId")) yield entriesMap
^
scala> val tPolicyEntry = for(entry <- entriesMap; if entry == "tPolicyId" yield entry
<console>:1: error: ')' expected but 'yield' found.
val tPolicyEntry = for(entry <- entriesMap; if entry == "tPolicyId" yield entry
^
scala> val tPolicyEntry = for(entry <- entriesMap; if entry == "tPolicyId") yield entry
<console>:10: warning: comparing values of types (String, String) and String using `==' will always yield false
val tPolicyEntry = for(entry <- entriesMap; if entry == "tPolicyId") yield entry
^
tPolicyEntry: scala.collection.immutable.Map[String,String] = Map()
scala> val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)) yield entry
<console>:1: error: illegal start of simple expression
val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)) yield entry
^
scala> val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)))) yield entry
<console>:1: error: illegal start of simple expression
val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)))) yield entry
^
scala> val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)) yield entry)
<console>:1: error: illegal start of simple expression
val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)) yield entry)
^
scala> val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)) yield entry))
<console>:1: error: illegal start of simple expression
val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry)) yield entry))
^
scala> val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry) yield entry))
<console>:1: error: ')' expected but 'yield' found.
val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry) yield entry))
^
scala> val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry) yield entry)
<console>:1: error: ')' expected but 'yield' found.
val tPolicyEntry = entriesMap.keys.foreach( (entry) => if(entriesMap.contains(entry) yield entry)
如您所见,我尝试以各种组合方式使用 filter、yield、foreach、for 等,但均未成功。我还是不明白/
所以,我已经很努力了,我可能犯了一些根本性的幼稚错误。
如果有人能帮我弄清楚如何得到我想要的地图,我将不胜感激学习经验
提前致谢
就像
一样简单 entriesMap.filter { case (k, _) => k == "tPolicyId" }
//> res0: scala.collection.immutable.Map[String,String] = Map(tPolicyId -> MasterCard)
或者干脆
entriesMap filterKeys { _ == "tPolicyId" }
您正在考虑命令式(迭代、比较,如果匹配则执行此操作),而不是 Scala 不可变集合倾向于的更高级别:
// get looks up value from a map using the key (fast)
// will give you an Option[String] back -
// Some(value) if the key exists, None if it doesn't
tpPolicyMap.get("tPolicyId").fold[Map[String, String]](
// result for None - no "tPolicyId"-key in the source map
Map.empty
)(value =>
// found, create a new map with that entry
Map("tPolicyId" -> value)
)
filter
的解决方案很好。您也可以执行 collect
,如果您打算在 filter
map
,这可能会很方便
entriesMap.collect{ case(k, v) if k == "tPolicyId" => (k, s"test${v}") } // example instead of plain (k, v)
// scala.collection.immutable.Map[String,String] = Map(tPolicyId -> testMasterCard)
等同于:
(entriesMap filterKeys { _ == "tPolicyId" }).map((kv) => (kv._1, s"test${kv._2}"))
// scala.collection.immutable.Map[String,String] = Map(tPolicyId -> testMasterCard)