Bunu yapmanın yöntemi 2,7'den 2,8'e değiştirildi. Retronym yöntemi 2.8 için iyi çalışıyor. 2.7 için, bunun yerine şöyle collections.jcl
kullanmak:
object Example {
import scala.collection.jcl
// Build the example data structure
val row1 = new java.util.ArrayList[Double]()
val row2 = new java.util.ArrayList[Double]()
val mat = new java.util.ArrayList[java.util.ArrayList[Double]]()
row1.add(1.0) ; row1.add(2.0) ; row2.add(3.0) ; row2.add(4.0)
mat.add(row1) ; mat.add(row2)
val named = new java.util.HashMap[String,java.util.ArrayList[java.util.ArrayList[Double]]]
named.put("matrix",mat)
// This actually does the conversion
def asScala(thing: java.util.HashMap[String,java.util.ArrayList[java.util.ArrayList[Double]]]) = {
Map() ++ (new jcl.HashMap(thing)).map(kv => {
(kv._1 ,
(new jcl.ArrayList(kv._2)).map(al => {
(new jcl.ArrayList(al)).toArray
}).toArray
)
})
}
}
Yani, genel bir fikir şudur: dışarıdan bir Scala eşdeğer Java koleksiyonunu sarın, ardından haritayı kullanmak sonraki her şeyi sarmak için seviyesi. Scala gösterimleri arasında geçiş yapmak isterseniz, çıkış yolunda bunu yapın (burada,
.toArray
uçlarında).
Ve burada çalışan örnek görebilirsiniz:
sizin koleksiyonları homojen olup olmadığını retronym cevabı iyidir, ama ben karışık koleksiyonu vardı benim için çalışmak değildi @
scala> Example.named
res0: java.util.HashMap[String,java.util.ArrayList[java.util.ArrayList[Double]]] = {matrix=[[1.0, 2.0], [3.0, 4.0]]}
scala> val sc = Example.asScala(Example.named)
sc: scala.collection.immutable.Map[String,Array[Array[Double]]] = Map(matrix -> Array([[email protected], [[email protected]))
scala> sc("matrix")(0)
res1: Array[Double] = Array(1.0, 2.0)
scala> sc("matrix")(1)
res2: Array[Double] = Array(3.0, 4.0)
Bu daha fazla bir tasarım problemi değil mi? Bu yapının semantiği nedir? Neden nesneleri dönüştürmek istiyorsun? –
Aslında bu verileri bir json dosyasından jackson json kütüphanesine (sjson ve lift-json denedim hem başarısız oldu) okuyordum. Jackson json'un bir scala api'si yok, bu yüzden işi yapmak için java API'yi kullandım. –