Scala Case Class'ı Java HashMap'e Dönüştürme

Mule ESB (Java Tabanlı) kullanıyorum ve verileri değiştiren ve oluşturan bazı ölçeklendirme bileşenlerine sahibim. Verilerim Vaka Sınıflarında temsil edilir. Onları Java'ya dönüştürmeye çalışıyorum, ancak yalnızca Scala türlerine dönüştürmelerini sağlamak çok zor. İşte yapmaya çalıştığım şeyin basitleştirilmiş bir örneği:

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)
        }
}

Current Error: Recursive method needs return type.

Scala Foo'm çok güçlü değil. Bu yöntemi başka bir yanıttan aldım burayı  ve temelde ne yaptığını bilmek, ancak bunu java.util.HashMap ve java.util.List olarak değiştirmek için yeterli değil

Beklenen Çıktı:

Result:{"name"="Test", "guid"="123asdfs", "resource"= {"guid"="4alskckd", "filename"="test.file"}}

UPDATE1: 1. getCCParams (caseClassInstance): Eklendi: @ [cem-catikkas per 22 üzerinde satır başına [String, Any] . IDE sözdizimi hatası hala "özyinelemeli yöntem ... sonuç türüne ihtiyaç duyuyor" ve "aşırı yüklenmiş yöntem java.util.HashMap" scala.collection.immutable.Map "a uygulanamaz" diyor. 2. java.util.HashMap değiştirildi [String, Object]

0
Aşağı oy kullandım ama açıklama yok mu?
katma yazar dlite922, kaynak

9 cevap

Hatanın size söylediklerini takip etmelisiniz. getCCParams , geri dönüş türünü bildirmeniz gereken özyinelemeli bir yöntem olduğundan.

def getCCParams(cc: AnyRef): Map[String, Any]
2
katma
Katma. Derleyici hala ana sınıfı bulamadığını veya yükleyemediğini söylüyor ve IDE hala aynı hatayı gösteriyor. Yöntem dönüş türünü de değiştirebilecek kadar Scala bilmiyorum. Bunu Map [String, Any] olarak nasıl değiştirebilirim. Bu işe yaradığında bile, bunu java tiplerine dönüştürmenin en iyi yolu nedir (asıl sorunum)
katma yazar dlite922, kaynak
Demek istediğim, hala bu hatayı fırlattı, değişiminle bile. Yanlış yere eklemiş olabilirim (yukarıda güncellenmiş postamı gördünüz mü?) Tamam, eğer Scala vaka sınıfları Java sınıflarıysa ve onları Hash haritasına çevirmenin daha iyi bir yolu varsa, lütfen bunun nasıl yapılabileceğini gösterin bir şansın olduğu zaman. Cevaplarınız için teşekkürler!
katma yazar dlite922, kaynak
Vaka sınıfları sadece sade Java sınıflarıdır, bu yüzden hiçbir şey yapmanıza gerek yoktur. Doğru anlıyorsanız, gerçekten yapmaya çalıştığınız şey, nesne grafiğinizi JSON'a seri hale getirmektir. Scala ile aşina değilseniz, istediğiniz herhangi bir Java JSON seri hale getirici kitaplığını kullanabilirsiniz. Nesne grafiğinizi HashMap'e dönüştürmeniz gerekmez.
katma yazar Cem Catikkas, kaynak
Ne demek "Harita [Dize, Herhangi]] ile nasıl değiştirilir? Yöntem gövdesine bakıldığında, gerçek geri dönüş tipi budur - sadece yukarıdaki cevapta olduğu gibi beyan etmeniz gerekir.
katma yazar Cem Catikkas, kaynak
Hangi IDE kullanıyorsunuz? IDE'niz değişikliklerden sonra kodu derledi mi? Komut satırından derlemeye çalışabilir misiniz?
katma yazar Cem Catikkas, kaynak

Hatanın size söylediklerini takip etmelisiniz. getCCParams , geri dönüş türünü bildirmeniz gereken özyinelemeli bir yöntem olduğundan.

def getCCParams(cc: AnyRef): Map[String, Any]
2
katma
Demek istediğim, hala bu hatayı fırlattı, değişiminle bile. Yanlış yere eklemiş olabilirim (yukarıda güncellenmiş postamı gördünüz mü?) Tamam, eğer Scala vaka sınıfları Java sınıflarıysa ve onları Hash haritasına çevirmenin daha iyi bir yolu varsa, lütfen bunun nasıl yapılabileceğini gösterin bir şansın olduğu zaman. Cevaplarınız için teşekkürler!
katma yazar dlite922, kaynak
Katma. Derleyici hala ana sınıfı bulamadığını veya yükleyemediğini söylüyor ve IDE hala aynı hatayı gösteriyor. Yöntem dönüş türünü de değiştirebilecek kadar Scala bilmiyorum. Bunu Map [String, Any] olarak nasıl değiştirebilirim. Bu işe yaradığında bile, bunu java tiplerine dönüştürmenin en iyi yolu nedir (asıl sorunum)
katma yazar dlite922, kaynak
Vaka sınıfları sadece sade Java sınıflarıdır, bu yüzden hiçbir şey yapmanıza gerek yoktur. Doğru anlıyorsanız, gerçekten yapmaya çalıştığınız şey, nesne grafiğinizi JSON'a seri hale getirmektir. Scala ile aşina değilseniz, istediğiniz herhangi bir Java JSON seri hale getirici kitaplığını kullanabilirsiniz. Nesne grafiğinizi HashMap'e dönüştürmeniz gerekmez.
katma yazar Cem Catikkas, kaynak
Ne demek "Harita [Dize, Herhangi]] ile nasıl değiştirilir? Yöntem gövdesine bakıldığında, gerçek geri dönüş tipi budur - sadece yukarıdaki cevapta olduğu gibi beyan etmeniz gerekir.
katma yazar Cem Catikkas, kaynak
Hangi IDE kullanıyorsunuz? IDE'niz değişikliklerden sonra kodu derledi mi? Komut satırından derlemeye çalışabilir misiniz?
katma yazar Cem Catikkas, kaynak

Hatanın size söylediklerini takip etmelisiniz. getCCParams , geri dönüş türünü bildirmeniz gereken özyinelemeli bir yöntem olduğundan.

def getCCParams(cc: AnyRef): Map[String, Any]
2
katma
Demek istediğim, hala bu hatayı fırlattı, değişiminle bile. Yanlış yere eklemiş olabilirim (yukarıda güncellenmiş postamı gördünüz mü?) Tamam, eğer Scala vaka sınıfları Java sınıflarıysa ve onları Hash haritasına çevirmenin daha iyi bir yolu varsa, lütfen bunun nasıl yapılabileceğini gösterin bir şansın olduğu zaman. Cevaplarınız için teşekkürler!
katma yazar dlite922, kaynak
Katma. Derleyici hala ana sınıfı bulamadığını veya yükleyemediğini söylüyor ve IDE hala aynı hatayı gösteriyor. Yöntem dönüş türünü de değiştirebilecek kadar Scala bilmiyorum. Bunu Map [String, Any] olarak nasıl değiştirebilirim. Bu işe yaradığında bile, bunu java tiplerine dönüştürmenin en iyi yolu nedir (asıl sorunum)
katma yazar dlite922, kaynak
Vaka sınıfları sadece sade Java sınıflarıdır, bu yüzden hiçbir şey yapmanıza gerek yoktur. Doğru anlıyorsanız, gerçekten yapmaya çalıştığınız şey, nesne grafiğinizi JSON'a seri hale getirmektir. Scala ile aşina değilseniz, istediğiniz herhangi bir Java JSON seri hale getirici kitaplığını kullanabilirsiniz. Nesne grafiğinizi HashMap'e dönüştürmeniz gerekmez.
katma yazar Cem Catikkas, kaynak
Ne demek "Harita [Dize, Herhangi]] ile nasıl değiştirilir? Yöntem gövdesine bakıldığında, gerçek geri dönüş tipi budur - sadece yukarıdaki cevapta olduğu gibi beyan etmeniz gerekir.
katma yazar Cem Catikkas, kaynak
Hangi IDE kullanıyorsunuz? IDE'niz değişikliklerden sonra kodu derledi mi? Komut satırından derlemeye çalışabilir misiniz?
katma yazar Cem Catikkas, kaynak

Sorunun içinden başka birisinin geçmesi durumunda bunu cevaplamak (burada olduğu gibi).

Aldığınız hatanın, geri dönüş türünün yöntem çağrımında (satır 22) bildirildiği gerçeğiyle ilgili olduğuna inanıyorum, ancak derleyici yöntemin bildiriminde (durumunuzda satır 17) bekliyordu. Aşağıdaki işe yaramış gibi görünüyor:

def getCCParams (cc: AnyRef): Harita [String, Any] = ...

Regarding the conversion from Scala Map to Java HashMap, by adding the ._ wildcard to the JavaConverters import statement, you manage to import all the methods of the object as single identifiers, which is a requirement for implicit conversions. This will include the asJava method which can then be used to convert the Scala Map to a Java one, and then this can be passed to the java.util.HashMap(Map<? extends K,? extends V> m) constructor to instantiate a 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)
2
katma

Sorunun içinden başka birisinin geçmesi durumunda bunu cevaplamak (burada olduğu gibi).

Aldığınız hatanın, geri dönüş türünün yöntem çağrımında (satır 22) bildirildiği gerçeğiyle ilgili olduğuna inanıyorum, ancak derleyici yöntemin bildiriminde (durumunuzda satır 17) bekliyordu. Aşağıdaki işe yaramış gibi görünüyor:

def getCCParams (cc: AnyRef): Harita [String, Any] = ...

Regarding the conversion from Scala Map to Java HashMap, by adding the ._ wildcard to the JavaConverters import statement, you manage to import all the methods of the object as single identifiers, which is a requirement for implicit conversions. This will include the asJava method which can then be used to convert the Scala Map to a Java one, and then this can be passed to the java.util.HashMap(Map<? extends K,? extends V> m) constructor to instantiate a 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)
2
katma

Sorunun içinden başka birisinin geçmesi durumunda bunu cevaplamak (burada olduğu gibi).

Aldığınız hatanın, geri dönüş türünün yöntem çağrımında (satır 22) bildirildiği gerçeğiyle ilgili olduğuna inanıyorum, ancak derleyici yöntemin bildiriminde (durumunuzda satır 17) bekliyordu. Aşağıdaki işe yaramış gibi görünüyor:

def getCCParams (cc: AnyRef): Harita [String, Any] = ...

Regarding the conversion from Scala Map to Java HashMap, by adding the ._ wildcard to the JavaConverters import statement, you manage to import all the methods of the object as single identifiers, which is a requirement for implicit conversions. This will include the asJava method which can then be used to convert the Scala Map to a Java one, and then this can be passed to the java.util.HashMap(Map<? extends K,? extends V> m) constructor to instantiate a 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)
2
katma

Java sınıfına java.util.Map arayüzünü uygulayarak, bunun tersine gitmeyi düşünüp düşünmediğinizi merak ediyorum. O zaman ileri geri çevirmek zorunda kalmazsınız, ancak bir Harita arayüzü kullanan aşağı akıştaki tüketiciler sadece işe yarar (örneğin, Groovy'nin alan nokta gösterimini kullanıyorsanız).

1
katma
Her zamanki gibi yaratıcı bir çözüm, ancak bunun beni daha fazla kod yazmam için bir kara deliğe indirmesinden korkuyorum. Eğer zamanım olsaydı, araştırmaya değecekti.
katma yazar dlite922, kaynak

Java sınıfına java.util.Map arayüzünü uygulayarak, bunun tersine gitmeyi düşünüp düşünmediğinizi merak ediyorum. O zaman ileri geri çevirmek zorunda kalmazsınız, ancak bir Harita arayüzü kullanan aşağı akıştaki tüketiciler sadece işe yarar (örneğin, Groovy'nin alan nokta gösterimini kullanıyorsanız).

1
katma
Her zamanki gibi yaratıcı bir çözüm, ancak bunun beni daha fazla kod yazmam için bir kara deliğe indirmesinden korkuyorum. Eğer zamanım olsaydı, araştırmaya değecekti.
katma yazar dlite922, kaynak

Java sınıfına java.util.Map arayüzünü uygulayarak, bunun tersine gitmeyi düşünüp düşünmediğinizi merak ediyorum. O zaman ileri geri çevirmek zorunda kalmazsınız, ancak bir Harita arayüzü kullanan aşağı akıştaki tüketiciler sadece işe yarar (örneğin, Groovy'nin alan nokta gösterimini kullanıyorsanız).

1
katma
Her zamanki gibi yaratıcı bir çözüm, ancak bunun beni daha fazla kod yazmam için bir kara deliğe indirmesinden korkuyorum. Eğer zamanım olsaydı, araştırmaya değecekti.
katma yazar dlite922, kaynak