如何从Scala代码中即时填充java.util.HashMap?
我是从
ScalaTest单元测试java代码,并希望在声明的同一个语句中填充一个java.util.HashMap.在Scala中可以做到这一点吗?
解决方法
有一些不同的方式来实现这一点,到目前为止,只有一些已经出现在答案中.
方法一:由于java.util.HashMap具有构造函数HashMap(Map<?extends K,?extends V> m),您可以传递一个有效的Java Map.您可以使用Scala的有用的JavaConversions进行简单的操作: scala> import scala.collection.JavaConversions._ import scala.collection.JavaConversions._ scala> val myMap = Map(1->"Hi",2->"Bye") myMap: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,Hi),(2,Bye)) scala> val jmap = new java.util.HashMap[Int,String](myMap) // Need explicit types jmap: java.util.HashMap[Int,String] = {1=Hi,2=Bye} 这里的缺点是,您必须已经有一个Scala地图(如果您只是要创建一个Java,那么您就必须要指定类型,那么这个地图很慢).但它是紧凑和无痛. 方法二:或者,您可以创建一个新的代码块作为声明语句,因此您甚至不需要有JavaConversions可用: scala> val jmap2 = { | val x = new java.util.HashMap[Int,String] | for ((k,v) <- List(1->"Howdy",2->"partner")) x.put(k,v) | x | } jmap2: java.util.HashMap[Int,String] = {1=Howdy,2=partner} 稍微不那么紧凑,但完全一般,和效率(或低效率)一样,你关心这样做. 方法三:另外,您可以创建一个HashMap的匿名子类,只要可以有一个子类(即.getClass不返回java.util.HashMap),并使用初始化器设置您的值: scala> val jmap3 = new java.util.HashMap[Int,String] { | put(1,"Yo"); put(2,"bro") | } jmap3: java.util.HashMap[Int,String] = {1=Yo,2=bro} scala> jmap3.getClass.getName res0: java.lang.String = $anon$1 scala> jmap3.getClass.getSuperclass.getName res1: java.lang.String = java.util.HashMap 当然,它的缺点在于它是HashMap的子类,而不是HashMap,但是它比代码块版本更紧凑,因为您不需要将新映射分配给val. 方法四:最后??,当然,你可以创建一个方法来做你想要的,而是改为: scala> def newJHM[A,B](kv: Iterable[(A,B)]) = { | val jhm = new java.util.HashMap[A,B] | kv.foreach(i => jhm.put(i._1,i._2)) | jhm | } newJHM: [A,B)])java.util.HashMap[A,B] scala> val jmap4 = newJHM(Seq(1->"Bye",2->"Now")) // Type inference now works jmap4: java.util.HashMap[Int,java.lang.String] = {1=Bye,2=Now} 这比其他人几乎不那么紧凑,并且得到类型正确,而不必指定它们,所以如果你不止一次地做这个,它可以是一个有吸引力的选择. 附:只是为了好玩,我已经展示了各种各样的方法来获取地图中的一些键值对,但它们不是特定于给定的方法(#1需要一个地图).根据您的喜好混搭. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |