Scala.List'i java.util.List'e nasıl dönüştürebilirim?


Yanıtlar:


69

Scala Listesi ve Java Listesi iki farklı canavardır, çünkü birincisi değişmez ve ikincisi değiştirilebilir. Yani, birinden diğerine geçmek için, önce Scala Listesini değiştirilebilir bir koleksiyona dönüştürmeniz gerekir.

Scala 2.7'de:

import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))

Scala 2.8'den itibaren:

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
asList(ListBuffer(List(1,2,3): _*))
val x: java.util.List[Int] = ListBuffer(List(1,2,3): _*)

Ancak, asListbu örnekte, beklenen tür bir Java Listise, son satırda gösterildiği gibi dönüştürme örtük olduğundan gerekli değildir .


Val x: java.util.List [Int] hala değişmez. Java'da x.add (bir şey) yapmayı deneyin - hata verecek
Vitamon

1
@Vitamon Benim için herhangi bir hata atmıyor - sadece onaylamak için test ettim.
Daniel C. Sobral

4
İyilik onaysız scala.collection.JavaConvertersüzerinde 2,12
Jeroen Kransen

2.12.1 için, bir Scala for döngüsü ile Java Listesinde hemen yineleme yaparken, JavaConverters paketindeki asScalaBuffer () ile daha iyi şanslar elde ettim: scala-lang.org/api/2.12.1/scala/collection/JavaConverters $ .html
Sarah Messer

165

Bundan neden daha önce bahsedilmediğinden emin değilim, ancak bence en sezgisel yol, JavaConverters'ınasJava dekoratör yöntemini doğrudan Scala listesinde çağırmaktır :

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

6
Aynı zamanda, bir süre istenmeyen bir sihire bağlı kalmak yerine açık olmanızı gerektirir.
Kamil Lelonek

Bu, listeyi daha sonra Java kodunda kullanmak üzere serileştirirken sorunlara neden olur ... ClassNotFoundException: scala.collection.convert.Wrappers ile sonuçlanır. Arrays.asList (foo: _ *) bu durumda çalışır.
Mohan

Scala'da Java'yı her kullanmam gerektiğinde bu sayfaya geliyorum. Ne yazık ki hiçbir şekilde fikri (( ".asJava" bana uygun ithalat öneri önermek var
Mulya

24

Önceki cevapları özetlemek için

Aşağıdakilere sahip olduğumuzu varsayarsak List:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

Eğer olmak istiyorsan açık ve tam olarak anlatmak dönüştürmek istediğini:

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

Eğer varsa eş denetim dönüşümleri istemiyoruz ve izin derleyici yapmak örtük sizin için işi:

scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._

scala> val javaList: java.util.List[Int] = scalaList
javaList: java.util.List[Int] = [1, 2, 3]

Kodunuzu nasıl kontrol etmek istediğiniz size kalmış.


8

Başlangıç ​​olarak Scala 2.13, paket bir pezevenk yoluyla scala.jdk.CollectionConverterssağlar ve paketleri değiştirir :asJavaSeqscala.collection.JavaConverters/JavaConversions

import scala.jdk.CollectionConverters._

// val scalaList: List[Int] = List(1, 2, 3)
scalaList.asJava
// java.util.List[Int] = [1, 2, 3]

7

Oldukça eski sorular, ancak cevap vereceğim, ancak önerilerin çoğu onaylanmadı.

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)

object JavaConversions in package collection is deprecated (since 2.12.0): use JavaConverters
duaagupd

5

Güncelleme

2.9.2 ölçekli:

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
val x: java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* )

sonuç

[1, 2, 3]

1

Tekli çağrılar için bunu elle yapmak en basit çözüm olabilir:

val slist = List (1, 2, 3, 4)          
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))   

Performansı ölçmedim.


0

Yukarıda önerildiği gibi yapmak, Java tarafında bile değişmez liste üretir. Bulduğum tek çalışan çözüm şudur:

def toJList[T](l:List[T]):util.List[T] = {
  val a = new util.ArrayList[T]
  l.map(a.add(_))
  a
 }

0

Scala 2.12.0'dan beri JavaConversions kullanımdan kaldırılmıştır.

Yani benim için en basit çözüm şuydu:

java.util.Arrays.asList("a","b","c")

1
Bu cevap, bir scala listesini java listesine dönüştürmek için bunun nasıl kullanılacağını açıklamıyor. Arrays.asList, yeniden boyutlandırılabilir bir Liste olmayan bir Arrays.ArrayList döndürdüğü için sorunlu olabilir, bu da bir util.ArrayList'iniz olduğunu düşünüyorsanız bazı beklenmedik hatalara neden olabilir.
puhlen

1
Kullanımdan import scala.collection.JavaConverters._
kaldırma
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.