Scala将List [Int]转换为java.util.List [java.lang.Integer]

Pan*_*Lee 35 scala scala-java-interop

在Scala中有一种很好的方法可以在List [Int]和java.util.List [java.lang.Integer]之间进行转换吗?

我正在与Java(Thrift)接口.

JavaConversions支持List - > java.util.List,并且Int - > java.lang.Integer之间存在implicits,但是我可以告诉我仍然需要额外的传递来手动进行转换.

val y = List(1)     
val z: java.util.List[Integer] = asList(y)  map { (x: Int) => x : java.lang.Integer }
Run Code Online (Sandbox Code Playgroud)

par*_*tic 26

显然你需要两次转换.但是,您可以将它们分组到一个隐式转换中:

implicit def toIntegerList( lst: List[Int] ) =
  seqAsJavaList( lst.map( i => i:java.lang.Integer ) )
Run Code Online (Sandbox Code Playgroud)

例:

scala> def sizeOf( lst: java.util.List[java.lang.Integer] ) = lst.size

scala> sizeOf( List(1,2,3) )
res5: Int = 3
Run Code Online (Sandbox Code Playgroud)


huy*_*hjl 23

因为Int的底层表示是Integer,所以可以直接转换为java.util.List[java.lang.Integer].它将为您节省O(n)操作和一些隐含的东西.

import collection.JavaConversions._

class A {
  def l() = asList(List(1,2)).asInstanceOf[java.util.List[java.lang.Integer]]
}
Run Code Online (Sandbox Code Playgroud)

然后您可以像这样使用Java:

A a = new A();
java.util.List<Integer> l = a.l();
Run Code Online (Sandbox Code Playgroud)

请注意,在2.9.0上,我收到了弃用警告asList(seqAsJavaList改为使用)