Как преобразовать Java-карту в Scala Map типа LinkedHashMap [String, ArrayList [String]]? - PullRequest
4 голосов
/ 04 июля 2011

из Java API я получаю

java.util.LinkedHashMap[String,java.util.ArrayList[String]]

, который мне затем нужно передать в качестве параметра в программу scala

val rmap = Foo.baz(parameter)

Этот параметр имеет тип scala:

Map[String,List[String]]

Так как я могу легко конвертировать

java.util.LinkedHashMap[String,java.util.ArrayList[String]]

в

Map[String,List[String]]

Я пытался использовать импорт scala.collection.JavaConversions._, но в моем случае это не работает (или, по крайней мере, это то, что я догадываюсь), потому что код scala находится в функции шаблона, и я могу только поместить импорт scala.collection.JavaConversions._ внутри функции.функция шаблона выглядит следующим образом:

def someFunc(param: java.util.LinkedHashMap[String,java.util.ArrayList[String]]) = {
import scala.collection.JavaConversions._
val rmap = Foo.baz(param) // param is of scala type Map[String,List[String]]
.......

Теперь Scala не выполняет автоматическое преобразование типа Java в тип Scala.

Это ошибка компилятора, которую я получаю: Возникла ошибка: несоответствие типов;найдено: java.util.LinkedHashMap [String, java.util.ArrayList [String]] требуется: Map [String, List [String]]

Ответы [ 4 ]

5 голосов
/ 05 июля 2011

У вас есть две проблемы: Map и List в Scala отличаются от версий Java.

scala.collection.JavaConversions.mapAsScalaMap создает изменяемую карту, поэтому с помощью изменяемой карты работает следующее:

import scala.collection.JavaConversions._
import scala.collection.mutable.Map

val f = new java.util.LinkedHashMap[String, java.util.ArrayList[String]]
var g: Map[String, java.util.ArrayList[String]] = f

ArrayList немного сложнее.Следующие работы:

import scala.collection.JavaConversions._
import scala.collection.mutable.Buffer

val a = new java.util.ArrayList[String]
var b: Buffer[String] = a

Но если мы попробуем

import scala.collection.JavaConversions._
import scala.collection.mutable.Map
import scala.collection.mutable.Buffer

val f = new java.util.LinkedHashMap[String, java.util.ArrayList[String]]
var g: Map[String, Buffer[String]] = f

, это не сработает.Для этого лучше всего самостоятельно определить явное неявное преобразование.

5 голосов
/ 04 июля 2011

Просто импортируйте scala.collection.JavaConversions, и вы должны быть установлены :) Он выполняет преобразования из коллекций Scala в коллекции Java и наоборот.

Если это не работает гладко, попробуйте:

val m: Map[String,List[String]] = javaMap

Вам также может понадобиться преобразовать каждый из списков на карте:

m.map {
  l => val sl: List[String] = l
  sl
}
1 голос
/ 04 июля 2011
scala.collection.JavaConversions.mapAsScalaMap

или что-то подобное в объекте JavaConversions

0 голосов
/ 11 февраля 2017

Вы можете попробовать использовать

val rmap = Foo.baz(parameter.asScala.toMap.mapValues(v => v.asScala.toList))

Импорт ниже в вашем коде -

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