栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用JavaConversions在Java和Scala集合之间进行隐式转换

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用JavaConversions在Java和Scala集合之间进行隐式转换

他们说尝试使用JavaConverters,因为不推荐使用JavaConversions。

scala> import collection.JavaConverters._import collection.JavaConverters._scala> def mergeMaps[A, B](ms: Set[Map[A, B]])(f: (B, B) => B): Map[A, B] =     | (new java.util.HashMap[A, B] /: (for (m <- ms; kv <- m) yield kv)) {     | case (a, kv) => a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv) }<console>:16: error: value contains is not a member of java.util.HashMap[A,B]       case (a, kv) => a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv) } ^<console>:16: error: java.util.HashMap[A,B] does not take parameters       case (a, kv) => a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv) }        ^<console>:16: error: type mismatch; found   : (A, B) required: String       case (a, kv) => a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv) }       ^<console>:15: error: type mismatch; found   : java.util.HashMap[A,B] required: Map[A,B]       (new java.util.HashMap[A, B] /: (for (m <- ms; kv <- m) yield kv)) {   ^scala> def mergeMaps[A, B](ms: Set[Map[A, B]])(f: (B, B) => B): Map[A, B] =     | (new java.util.HashMap[A, B].asScala /: (for (m <- ms; kv <- m) yield kv)) {     | case (a, kv) => a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv) }<console>:15: error: type mismatch; found   : scala.collection.mutable.Map[A,B] required: scala.collection.immutable.Map[A,B]       (new java.util.HashMap[A, B].asScala /: (for (m <- ms; kv <- m) yield kv)) {^scala> def mergeMaps[A, B](ms: Set[Map[A, B]])(f: (B, B) => B): Map[A, B] =     | (new java.util.HashMap[A, B].asScala.toMap /: (for (m <- ms; kv <- m) yield kv)) {     | case (a, kv) => a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv) }mergeMaps: [A, B](ms: Set[Map[A,B]])(f: (B, B) => B)Map[A,B]

也许要说明为什么不推荐使用它:

scala> def mergeMaps[A, B](ms: Set[Map[A, B]])(f: (B, B) => B): Map[A, B] =     | (new java.util.HashMap[A, B] /: (for (m <- ms; kv <- m) yield kv)) {     | case (a, kv) => a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv) }<console>:19: error: type mismatch; found   : scala.collection.mutable.Map[A,B] required: java.util.HashMap[A,B]       case (a, kv) => a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv) }   ^<console>:18: error: type mismatch; found   : java.util.HashMap[A,B] required: Map[A,B]       (new java.util.HashMap[A, B] /: (for (m <- ms; kv <- m) yield kv)) {   ^

注意for理解会产生一对对。

scala> def mergeMaps[A, B](ms: Set[Map[A, B]])(f: (B, B) => B) = for (m <- ms; kv <- m) yield kvmergeMaps: [A, B](ms: Set[Map[A,B]])(f: (B, B) => B)scala.collection.immutable.Set[(A, B)]

显然,推论既无法完成转换又无法找出操作类型。

有时将表达式分开会有助于推理,但不能在此进行。

scala> def mergeMaps[A, B](ms: Set[Map[A, B]])(f: (B, B) => B): Map[A, B] = {     | val ss = for (m <- ms; kv <- m) yield kv     | (new java.util.HashMap[A, B] /: ss) {     | case (a, kv) => a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv) }     | }


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/414352.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号