簡體   English   中英

如何將 Java 列表映射轉換為 Scala 列表映射

[英]How to convert Java Map of Lists to 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

Map[String,List[String]]

想知道JavaScala的轉換。

我試過這個,但沒有得到預期的輸出

在 Scala 方面,

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

結果是一個逗號分隔的值字符串

這是這樣做的方法:

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因為MapList是不可改變的斯卡拉,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調用創建,因此無需在map調用之前轉換為immutable.Map

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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