簡體   English   中英

將 Scala 嵌套 Map 轉換為 Java 嵌套 util.Z46F3EA056CAA3126B91F3F70BEEA0

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM