我有一个scala代码段,如下所示:
// country code to nameToPlaces traversable
val input : Traversable[(Int, java.util.Map[String, java.util.Set[String]])] ...
val nameToPlacesMap : Map[String, Set[String]] = input.toMap.
values.
map (x => x.toSeq). // throws a class cast exception
reduce((x,y) => x ++ y).
groupBy(_._1).
mapValues(_.map(_._2).
reduce((x,y)=>x.toSet ++ y.toSet))
预计 nameToPlacesMap
将整理所有国家/地区的所有nameToPlaces。
但是,在运行此代码时,我得到了classcastexception
java.util.HashMap cannot be cast to scala.collection.immutable.Map
我尝试添加asScala
但没有用。我也在导入import scala.collection.JavaConverters._
任何帮助将不胜感激。
注意:我不认为这个问题是如下所述的通用转发例外的副本:请修改您的判断。
答案 0 :(得分:0)
您的外部地图中有多个Java集合,您必须确保将它们全部转换。据我所知,以下内容适合您:
import java.util
import scala.collection.JavaConverters._
import scala.collection.mutable
val input : Traversable[(Int, java.util.Map[String, java.util.Set[String]])] =
Seq((1, new util.HashMap[String, java.util.Set[String]]()))
val nameToPlacesMap : Map[String, mutable.Set[String]] = input.toMap.mapValues(
// convert inner Map
_.asScala.mapValues(
// convert java.util.Set
mutable.Set.empty ++ _.asScala)
).values.
map (x => x.toSeq). // hopefully not anymore :: throws a class cast exception
reduce((x,y) => x ++ y).
groupBy(_._1).
mapValues(_.map(_._2).
reduce((x,y)=> x ++ y))