如何在Gatling Feeder中传递java HashMap

时间:2016-04-26 19:25:58

标签: java scala dictionary hashmap gatling

我正在尝试调用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));
                            ^

1 个答案:

答案 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
}