【问题标题】:Convert Scala nested Map to Java nested util.Map将 Scala 嵌套 Map 转换为 Java 嵌套 util.Map
【发布时间】:2019-09-20 18:34:49
【问题描述】:

我在我的项目中使用 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 与内部的其他 Map 和 List 转换为它们的 Java 等价物?

【问题讨论】:

  • 什么版本的scala?你得到什么错误?

标签: java scala


【解决方案1】:

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。试试看会发生什么。

【讨论】:

  • 我收到non-variable type argument AnyRef in type pattern scala.collection.immutable.Map[_,AnyRef] (the underlying of Map[_,AnyRef]) is unchecked since it is eliminated by erasure
【解决方案2】:

您可以使用JavaConverters,这里是example,您可以如何递归地转换集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-02
    • 2012-12-08
    • 2019-12-27
    • 2020-08-24
    • 1970-01-01
    • 2022-01-16
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多