我正在尝试调用Map.canBuildFrom((“dataLine”,dataLine));其中数据行是HashMap,我想传递hashMap,我该怎么做?
val myCustomFeeder = new Feeder[String] {
override def hasNext = true
override def next: Map[String, String] = {
var dataLine: java.util.HashMap[String, String] = new RandomDataGenerator().getMessageMap(); // this returns a java.util.HashMap
Map.canBuildFrom(("dataLine", dataLine)); // does not compile.
}
}
我得到的错误是:
Error:(91, 11) overloaded method value apply with alternatives:
()scala.collection.mutable.Builder[(A, B),scala.collection.immutable.Map[A,B]] <and>
(from: Map.Coll)scala.collection.mutable.Builder[(A, B),scala.collection.immutable.Map[A,B]]
cannot be applied to ((String, java.util.HashMap[String,String]))
Map.canBuildFrom(("dataLine", dataLine));
^
答案 0 :(得分:1)
正如@Łukasz所建议的那样,使用JavaConversions
:
def next: Map[String, String] = {
var dataLine: java.util.HashMap[String, String] = ???
scala.collection.JavaConversions.mapAsScalaMap(dataLine).toMap
}
或者,使用含义:
def next: Map[String, String] = {
var dataLine: java.util.HashMap[String, String] = ???
import scala.collection.JavaConversions._
dataLine.toMap
}
这里唯一的缺点是,因为你需要返回不可变的Map
,你必须调用toMap
,它基本上复制了整个地图。
mapAsScalaMap
返回一个围绕Java地图的包装器,与复制相比这是一个便宜的操作,所以如果你能做到这一点你会有更好的性能:
def next: scala.collection.mutable.Map[String, String] = {
var dataLine: java.util.HashMap[String, String] = ???
import scala.collection.JavaConversions._
dataLine
}