![](/img/trans.png)
[英]How to convert Scala HashMap to Java HashMap for serializing to disk?
[英]How To Convert Scala Case Class to Java HashMap
我正在使用Mule ESB(基於Java),並且有一些Scala組件可以修改和創建數據。 我的數據以案例類表示。 我正在嘗試將它們轉換為Java,但是讓它們轉換為Scala類型是一個挑戰。 這是我要執行的操作的簡化示例:
package com.echostar.ese.experiment
import scala.collection.JavaConverters
case class Resource(guid: String, filename: String)
case class Blackboard(name: String, guid:String, resource: Resource)
object CCC extends App {
val res = Resource("4alskckd", "test.file")
val bb = Blackboard("Test", "123asdfs", res)
val myMap = getCCParams(bb)
val result = new java.util.HashMap[String,Object](myMap)
println("Result:"+result)
def getCCParams(cc: AnyRef) =
(Map[String, Any]() /: cc.getClass.getDeclaredFields) {(a, f) =>
f.setAccessible(true)
val value = f.get(cc) match {
// this covers tuples as well as case classes, so there may be a more specific way
case caseClassInstance: Product => getCCParams(caseClassInstance): Map[String, Any]
case x => x
}
a + (f.getName -> value)
}
}
當前錯誤:遞歸方法需要返回類型。
我的Scala Foo不太強壯。 我抓住從另一個回答這個方法在這里基本上知道它在做什么,但不足以改變這java.util.HashMap中和的java.util.List
預期產量:
Result:{"name"="Test", "guid"="123asdfs", "resource"= {"guid"="4alskckd", "filename"="test.file"}}
UPDATE1:1.在每個@ cem-catikkas的第22行上方添加了getCCParams(caseClassInstance): Map[String, Any]
。 IDE語法錯誤仍然顯示“遞歸方法...需要結果類型”和“重載方法java.util.HashMap無法應用於scala.collection.immutable.Map”。 2.更改了java.util.HashMap [String,Object]
您應該按照錯誤告訴您的內容進行操作。 由於getCCParams
是遞歸方法,因此您需要聲明其返回類型。
def getCCParams(cc: AnyRef): Map[String, Any]
以防萬一其他人遇到這個問題(在我身上)。
我相信您得到的錯誤與以下事實有關:返回類型是在方法調用時聲明的(第22行),但是編譯器希望在方法的聲明中聲明它(在您的情況下,第17行)。 以下似乎有效:
def getCCParams(cc: AnyRef): Map[String, Any] = ...
關於從Scala Map到Java HashMap的轉換 ,通過將._
通配符添加到JavaConverters
import語句,您可以設法將對象的所有方法作為單個標識符導入,這是隱式轉換的要求。 這將包括asJava
方法,該方法隨后可用於將Scala Map轉換為Java,然后可以將其傳遞給java.util.HashMap(Map<? extends K,? extends V> m)
構造函數以實例化一個HashMap
:
import scala.collection.JavaConverters._
import java.util.{HashMap => JHashMap}
...
val myMap = getCCParams(bb)
val r = myMap.asJava // converting to java.util.Map[String, Any]
val result: JHashMap[String,Any] = new JHashMap(r)
我想知道您是否考慮過通過在case類中實現java.util.Map接口來解決問題? 這樣,您就不必來回轉換,但是任何使用Map接口的下游使用者都可以使用(例如,如果您使用的是Groovy的字段點符號)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.