将Scala嵌套Map转换为Java嵌套util.Map

时间:2019-09-19 15:30:47

标签: java scala

我在项目中使用Scala并希望与Stripe集成,但是它仅提供Java API。例如,要创建会话,我可以使用:

val params = new util.HashMap[String, AnyRef]
val paymentMethodTypes = new util.ArrayList[String]
paymentMethodTypes.add("card")
params.put("payment_method_types", paymentMethodTypes)
params.put("mode", "setup")
params.put("success_url", "https://test.app/success")
params.put("cancel_url", "https://test.app/cancel")
val session = Session.create(params)

此代码可以完美运行,但是非常丑陋,并且包含许多样板。我想使用Scala Map[String, AnyRef]并按如下方式创建会话:

import scala.collection.JavaConverters._
val params2: Map[String, AnyRef] = Map(
  "payment_method_types" -> List("card"),
  "mode" -> "setup",
  "success_url" -> "https://test.app/success",
  "cancel_url" -> "https://test.app/cancel"
)
val session2 = Session.create(mapAsJavaMap[String, AnyRef](params2))

事实证明,mapAsJavaMap无法转换Map中的嵌套对象。有没有一种方法可以将任意Scala Map及其内部的其他Maps和Lists转换为它们的Java等价物?

2 个答案:

答案 0 :(得分:2)

JavaConverters已过时。尝试CollectionConverters

import scala.jdk.CollectionConverters._

def convertMap[K](scalaMap :Map[K,AnyRef]) :java.util.Map[K,AnyRef] =
  scalaMap.map{ case (k,v) => v match {
    case m:Map[_,AnyRef] => (k, convertMap(m))  //recursive
    case l:List[_]       => (k, l.asJava)       //java.util.List[_]
    case _               => (k, v)              //unchanged
  }}.asJava

不确定所有值都为AnyRef类型的内容是否对您真正有用。试试看,看看会发生什么。

答案 1 :(得分:1)

您可以使用JavaConverters,这里是example的递归转换方法。