![](/img/trans.png)
[英]Scala collections: util.Map[String, AnyRef] - Map[String, String]
[英]Convert Scala nested Map to Java nested util.Map
我在我的項目中使用 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 與內部的其他地圖和列表轉換為其 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
類型。 嘗試一下,看看會發生什么。
您可以使用JavaConverters ,這里是一個如何遞歸轉換 collections 的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.