36

有没有办法Scala将 a 转换List[Int]java.util.List[java.lang.Integer]

我正在与 Java (Thrift) 交互。

JavaConversionssupportList --> java.util.List和implicits 之间存在Int --> java.lang.Integer,但据我所知,我仍然需要额外的传递来手动进行转换:

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

6 回答 6

27

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

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
于 2011-08-09T06:16:46.033 回答
25

因为 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 上,我收到一个弃用警告asListseqAsJavaList改为使用)

于 2011-08-09T14:47:13.177 回答
4

你试过了吗:

val javalist = collection.JavaConversions.asJavaList (y)

我不确定您是否需要转换 Int=>Integer 或 Int=>int 。你能试试吗?

更新: 时代在变。今天,您将收到该代码的弃用警告。改用:

import scala.collection.JavaConverters._
val y = List (1)
> y: List[Int] = List(1)

val javalist = (y).asJava
> javalist: java.util.List[Int] = [1]
于 2011-08-09T04:42:01.333 回答
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 的隐式转换是标准库的一部分,因此在这种情况下的用法如下所示:

  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)) }
于 2016-06-07T21:05:00.343 回答
1

开始Scala 2.13,标准库包括scala.jdk.CollectionConverters提供 Scala 到 Java 的隐式集合转换。

我们可以结合它java.lang.Integer::valueOf来将 Scala 转换Int为 Java Integer

import scala.jdk.CollectionConverters._

List(1, 2, 3).map(Integer.valueOf).asJava
// java.util.List[Integer] = [1, 2, 3]
于 2019-03-29T22:02:31.063 回答
0

我试图将 a 传递Map[String, Double]给 Java 方法。但问题是JavaConversions将 转换Map为 java Map,但将 scala 保持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]。然后你可以将它传递给一个期望 a 的 java 函数,Map<String, Double>并且由于隐式转换,Scala Map 将被转换为java.util.Map

在您的情况下是相同的,但是使用Int.box

val y = List(1)
val javay = y.map(Int.box)
于 2018-07-11T10:33:48.587 回答