Как конвертировать Java Map of Lists в Scala Map of Lists

У меня есть карта Java списков,

Map<String, List<String>> stringToListOfStrings = new HashMap<String, List<String>>();
        stringToListOfStrings.put("key1", Arrays.asList("k1v1", "k1v2"));
        stringToListOfStrings.put("key2", Arrays.asList("k2v1", "k2v2"));
        stringToListOfStrings.put("key3", Arrays.asList("k3v1", "k3v2"));

Я хочу преобразовать это в Scala Карта списков

Map[String,List[String]]

Хотелось бы узнать конвертацию как на Java, так и на Scala.

и на стороне Scala,

def convertJavaToScala(stringString: java.util.HashMap[String, java.util.List[String]]) {
    val scalaMap = stringString.asScala
    scalaMap.get("key1")
    scalaMap.get("key1").foreach(println)
  }

но результатом была строка значений, разделенных запятыми.

Всего 2 ответа


Вот способ сделать это:

 import scala.collection.JavaConverters._ def convertJavaToScala(stringString: java.util.HashMap[String, java.util.List[String]]): Map[String,List[String]] = { val scalaMap: Map[String, java.util.List[String]] = stringString.asScala.toMap scalaMap.mapValues(_.asScala.toList) } 

И когда вы бежите:

 import java.util.Arrays val stringToListOfStrings = new java.util.HashMap[String, java.util.List[String]]() stringToListOfStrings.put("key1", Arrays.asList("k1v1", "k1v2")) stringToListOfStrings.put("key2", Arrays.asList("k2v1", "k2v2")) stringToListOfStrings.put("key3", Arrays.asList("k3v1", "k3v2")) convertJavaToScala(stringToListOfStrings) // Displays // Map(key1 -> List(k1v1, k1v2), key2 -> List(k2v1, k2v2), key3 -> List(k3v1, k3v2)) 

По сути, вы должны добавить .toMap / .toList после .asScala потому что Map и List неизменны в Scala, в отличие от Java.


Это эффективный способ сделать преобразование:

def convertJavaToScala(ss: java.util.HashMap[String, java.util.List[String]]): Map[String, List[String]] =
  ss.asScala.map{ case (k, v) => k -> v.asScala.toList }(collection.breakOut)

Использование map вместо mapValues позволяет избежать повторной оценки кода преобразования при доступе к элементам Map . Использование collection.breakOut означает, что immutable.Map будет создан непосредственно из вызова map поэтому нет необходимости преобразовывать в immutable.Map перед вызовом map .


Есть идеи?

10000