簡體   English   中英

如何將Scala Case類轉換為Java HashMap

[英]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.

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