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

标签 java scala

我在项目中使用Scala,想与Stripe集成,但它只提供Java API。例如,要创建 session ,我使用:

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] 并创建 session ,如下所示:

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 等效项?

最佳答案

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 类型。尝试一下,看看会发生什么。

关于java - 将 Scala 嵌套 Map 转换为 Java 嵌套 util.Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58014461/

相关文章:

java - 使用assertJ 断言列表元素的属性

java - SetFontSize 在 JRDesignStyle 中已弃用

java - Hadoop JobClient getJob方法执行时间太长

Java Spark数据集autogen编译异常

java - CAS 身份验证 - UrlRewriteFilter 使 request.getRemoteUser() 无效

scala:带有状态的 PartialFunction

scala - 将字符转换为字符串

scala - 如何在 Scala 中链接 Future[\/[A,B]]?

scala - Spark Dataframe - 获取所有对列表(Scala)

java - CTabFolder 选择的焦点事件