Как конвертировать Java Map of Lists в Scala Map of Lists - PullRequest
2 голосов
/ 17 мая 2019

У меня есть 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 списков

Map[String,List[String]]

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

Я пробовал это, но не получил ожидаемый результат https://stackoverflow.com/a/11903737/4550466

и на стороне 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 ]

4 голосов
/ 17 мая 2019

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

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.

2 голосов
/ 17 мая 2019

Это эффективный способ конвертации:

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.

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