Scala
是否有办法将List[Int]
转换为java.util.List[java.lang.Integer]
?
我正在与Java(Thrift)接口。
JavaConversions
支持List --> java.util.List
,Int --> java.lang.Integer
之间存在隐含,但据我所知,我还需要额外的传递来手动进行转换:
val y = List(1)
val z: java.util.List[Integer] = asList(y) map { (x: Int) => x : java.lang.Integer }
答案 0 :(得分:26)
显然你需要两次转换。但是,您可以将它们分组到一个隐式转换中:
implicit def toIntegerList( lst: List[Int] ) =
seqAsJavaList( lst.map( i => i:java.lang.Integer ) )
示例:
scala> def sizeOf( lst: java.util.List[java.lang.Integer] ) = lst.size
scala> sizeOf( List(1,2,3) )
res5: Int = 3
答案 1 :(得分:21)
因为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]]
}
然后你可以像这样使用Java:
A a = new A();
java.util.List<Integer> l = a.l();
请注意,在2.9.0上,我在asList
上收到了弃用警告(改为使用seqAsJavaList
答案 2 :(得分:4)
你有没有尝试过:
val javalist = collection.JavaConversions.asJavaList (y)
我不确定,这里是否需要转换Int =&gt; Integer或Int =&gt; int。你能尝试一下吗?
<强>更新强> 时代,他们是一个变化。今天,您将收到该代码的弃用警告。改为使用:
import scala.collection.JavaConverters._
val y = List (1)
> y: List[Int] = List(1)
val javalist = (y).asJava
> javalist: java.util.List[Int] = [1]
答案 3 :(得分:2)
这在最外层并没有隐含,但我喜欢这种通用方法并且已经为几种类型的集合(List,Map)实现了它。
import java.util.{List => JList}
import scala.collection.JavaConverters._
def scalaList2JavaList[A, B](scalaList: List[A])
(implicit a2bConversion: A => B): JList[B] =
(scalaList map a2bConversion).asJava
由于从Int到Integer的隐式转换是标准lib的一部分,因此在这种情况下的用法将如下所示:
scalaList2JavaList[Int, Integer](someScalaList)
(因为我有这些可用,因为它们是我原来的实现......)
import java.util.{List => JList}
import scala.collection.JavaConversions._
def javaList2ScalaList[A, B](javaList: JList[A])
(implicit a2bConversion: A => B): List[B] =
javaList.toList map a2bConversion
用法:
javaList2ScalaList[Integer, Int](someJavaList)
只要包含类型的隐式转换在范围内,就可以对所有列表重复使用。
(如果你有点好奇,这是我对地图的实施......)
def javaMap2ScalaMap[A, B, C, D](javaMap: util.Map[A, B])(implicit a2cConversion: A => C, b2dConversion: B => D): Map[C, D] =
javaMap.toMap map { case (a, b) => (a2cConversion(a), b2dConversion(b)) }
答案 4 :(得分:0)
我试图将Map[String, Double]
传递给Java方法。但是问题是JavaConversions
将Map
转换为Java Map
,但是将标量Double
保留不变,而不是将其转换为java.lang.Double
。经过数小时的搜索,我发现[Alvaro Carrasco的答案])https://stackoverflow.com/a/40683561/1612432)就像这样简单:
val scalaMap = // Some Map[String, Double]
val javaMap = scalaMap.mapValues(Double.box)
此后,javaMap
是Map[String, java.lang.Double]
。然后,您可以将其传递给期望Map<String, Double>
的java函数,并且由于隐式转换,Scala Map将被转换为java.util.Map
您的情况将是相同的,但使用Int.box
:
val y = List(1)
val javay = y.map(Int.box)
答案 5 :(得分:0)
从Scala 2.13
开始,标准库包括scala.jdk.CollectionConverters
,该库提供了Scala到Java隐式集合的转换。
我们可以与java.lang.Integer::valueOf
结合使用,将Scala的Int
转换为Java的Integer
:
import scala.jdk.CollectionConverters.Ops._
List(1, 2, 3).map(Integer.valueOf).asJava
// java.util.List[Integer] = [1, 2, 3]