web-dev-qa-db-ja.com

Scala List [Int]をJava.util.List [Java.lang.Integer]に変換します

ScalaList[Int]Java.util.List[Java.lang.Integer]に変換する方法はありますか?

Java(Thrift)とインターフェースしています。

JavaConversionsList --> 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 }
36
Pandora Lee

どうやらあなたは両方の変換が必要です。ただし、それらを1つの暗黙的な変換にグループ化できます。

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
27
paradigmatic

Intの基底表現は整数であるため、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を使用してください)

25
huynhjl

試しましたか:

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]
4
user unknown

これには最外層に暗黙的なものはありませんが、私はこの一般的なアプローチが好きで、いくつかのタイプのコレクション(リスト、マップ)に実装しました。

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)) }
2
jm0

Map[String, Double]をJavaメソッドに渡そうとしましたが、問題はJavaConversionsMapをJava = Mapですが、Java.lang.Doubleに変換する代わりに、scala Doubleのままにします。数時間の調査の後、[AlvaroCarrascoの回答]を見つけました。 ) 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マップはJava.util.Mapに変換されます

あなたの場合も同じですが、Int.boxを使用します:

val y = List(1)
val javay = y.map(Int.box)
0
ElBaulP

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]
0
Xavier Guihot