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

Ale*_*sky 106 java scala scala-java-interop

如何将Scala转换scala.List为Java java.util.List

dim*_*sli 154

不知道为什么之前没有提到过,但我认为最直观的方法是直接在Scala列表上调用JavaConvertersasJava装饰器方法:

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]
Run Code Online (Sandbox Code Playgroud)

  • 它还要求你明确而不是依赖于某些可能不需要的隐含魔法. (5认同)

Dan*_*ral 68

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

在Scala 2.7上:

import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))
Run Code Online (Sandbox Code Playgroud)

从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): _*)
Run Code Online (Sandbox Code Playgroud)

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

  • 从2.12开始,不再支持`scala.collection.JavaConverters`。 (4认同)

Kam*_*nek 22

总结以前的答案

假设我们有以下内容List:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

如果您想要明确准确告诉您要转换的内容:

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

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

如果您不想进行协同控制转换,让编译器为您隐式工作:

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]
Run Code Online (Sandbox Code Playgroud)

由您决定如何控制代码取决于您自己.


Xav*_*hot 11

开始Scala 2.13时,包scala.jdk.CollectionConverters提供asJava通过的皮条客Seq,并替换套餐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]
Run Code Online (Sandbox Code Playgroud)


Shi*_*mar 6

虽然我会回答,但很多旧的问题已经回答了,但大多数建议都已被弃用.

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
Run Code Online (Sandbox Code Playgroud)


Gui*_*ssé 5

更新

与scala 2.9.2:

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

结果

[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)