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

时间:2011-08-09 04:24:54

标签: scala scala-java-interop

Scala是否有办法将List[Int]转换为java.util.List[java.lang.Integer]

我正在与Java(Thrift)接口。

JavaConversions支持List --> java.util.ListInt --> java.lang.Integer之间存在隐含,但据我所知,我还需要额外的传递来手动进行转换:

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

6 个答案:

答案 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方法。但是问题是JavaConversionsMap转换为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)

此后,javaMapMap[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]