加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何从Scala代码中即时填充java.util.HashMap?

发布时间:2020-12-16 19:04:30 所属栏目:安全 来源:网络整理
导读:我是从 ScalaTest单元测试java代码,并希望在声明的同一个语句中填充一个java.util.HashMap.在Scala中可以做到这一点吗? 解决方法 有一些不同的方式来实现这一点,到目前为止,只有一些已经出现在答案中. 方法一:由于java.util.HashMap具有构造函数HashMap(Ma
我是从 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需要一个地图).根据您的喜好混搭.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读