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 }
どうやらあなたは両方の変換が必要です。ただし、それらを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
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
を使用してください)
試しましたか:
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]
これには最外層に暗黙的なものはありませんが、私はこの一般的なアプローチが好きで、いくつかのタイプのコレクション(リスト、マップ)に実装しました。
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)) }
Map[String, Double]
をJavaメソッドに渡そうとしましたが、問題はJavaConversions
がMap
を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)
この後、javaMap
はMap[String, Java.lang.Double]
になります。次に、これをMap<String, Double>
を期待するJava関数に渡すことができ、暗黙の変換のおかげでScalaマップはJava.util.Map
に変換されます
あなたの場合も同じですが、Int.box
を使用します:
val y = List(1)
val javay = y.map(Int.box)
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]