Преобразование вложенной карты Scala в вложенную утилиту Java. Карта - PullRequest
0 голосов
/ 19 сентября 2019

Я использую 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 не может конвертировать вложенные объекты на карте.Есть ли способ конвертировать произвольную Карту Scala с другими Картами и Списками внутри в их эквиваленты Java?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

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 голос
/ 20 сентября 2019

Вы можете использовать JavaConverters , и вот пример , как вы можете конвертировать коллекции рекурсивно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...