Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将scala.List转换为java.util.List?_Java_Scala_Scala Java Interop - Fatal编程技术网

如何将scala.List转换为java.util.List?

如何将scala.List转换为java.util.List?,java,scala,scala-java-interop,Java,Scala,Scala Java Interop,如何将Scala的Scala.List转换为Java的Java.util.List?Scala列表和Java列表是两种不同的野兽,因为前者是不可变的,后者是可变的。因此,要从一个列表转换到另一个列表,首先必须将Scala列表转换为可变集合 在Scala 2.7上: import scala.collection.jcl.Conversions.unconvertList import scala.collection.jcl.ArrayList unconvertList(new ArrayLi

如何将Scala的
Scala.List
转换为Java的
Java.util.List

Scala列表和Java列表是两种不同的野兽,因为前者是不可变的,后者是可变的。因此,要从一个列表转换到另一个列表,首先必须将Scala列表转换为可变集合

在Scala 2.7上:

import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))
从Scala 2.8开始:

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): _*)

但是,如果预期的类型是Java
List
,则该示例中的
asList
不是必需的,因为转换是隐式的,如最后一行所示。

对于单次调用,手动执行可能是最简单的解决方案:

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

我没有衡量表现

更新

使用scala 2.9.2:

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

[1, 2, 3]

如上所述,即使在Java端,也会生成不可变的列表。 我找到的唯一可行的解决方案是:

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

不确定为什么之前没有提到这一点,但我认为最直观的方法是直接在Scala列表上调用的
asJava
decorator方法:

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]
总结前面的答案 假设我们有以下
列表

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]

如果您不希望协同控制转换,并让编译器使隐式为您工作:

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]

如何控制代码取决于您自己。

虽然我会回答一些老生常谈的问题,但大多数建议都被否决了

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
自Scala 2.12.0以来

所以对我来说最简单的解决方案是:

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

Scala 2.13
开始,该软件包通过一个名为
Seq
的pimp提供并替换软件包
Scala.collection.JavaConverters/JavaConversions

import scala.jdk.CollectionConverters._

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

val x:java.util.List[Int]仍然是不可变的。只需在Java中尝试x.add(某物)——它将抛出error@Vitamon它没有给我带来任何错误——我只是测试了它以确认。从2.12版本开始,在2.12.1版本中使用
scala.collection.JavaConverters
,在使用scala for循环立即迭代Java列表时,我对asScalaBuffer()的运气更好在JavaConverters包中:它还要求您是显式的,而不是依赖于某些可能不需要的隐式魔术。如果序列化列表以供以后在Java代码中使用,这会导致问题。。。它会导致ClassNotFoundException:scala.collection.convert.Wrappers。asList(foo:*)在这种情况下起作用。每当我需要在Scala中使用Java时,我都会来到这个页面。不幸的是,没有办法为“.asJava”提供适当的导入建议((此答案没有解释如何使用此选项将scala列表转换为java列表。Arrays.asList也可能有问题,因为它返回的Arrays.ArrayList不是一个可调整大小的列表,可能会导致一些意外错误。如果您认为有util.ArrayList.Deprection,则存在
导入scala.collection.JavaConverters.
对于包集合中的2.12.4
对象JavaConversions不推荐使用(从2.12.0开始):使用JavaConversions
dude…更改接受的答案…(请)