3

私はScalaを初めて使用し、既存のJavaコードをPlayFrameworkのScala固有の機能と統合しようとしています。

val scalaMap = getScalaMap() // returns Map[String,Seq[String]]

スカラマップをJavaコレクションを使用するように変換するためのクリーンな方法は何ですか?

val javaMap = ???  //  java.util.Map<String,List<String>> 

JavaConversionsを使用したいようですが、ネストされたコレクションをチェーンする方法がわかりません。ありがとう!

4

2 に答える 2

4

これを試して:

import collection.JavaConverters._
val javaMap = scalaMap.mapValues(_.asJava).asJava

それは2つのステップで仕事をします:

  1. 最初に変換Map[String,Seq[String]]しますMap[String,java.util.List[String]]

  2. 次に、Javaへのマップ全体Mapjava.util.Map[String,java.util.List[String]]

于 2012-10-05T14:12:32.723 に答える
1

使用しないでくださいmapValues。使用map

import collection.JavaConverters._
val javaMap = scalaMap.map { case (k,v) => (k, v.asJava) }.asJava

を使用mapValuesすると、アクセスされるたびに内部マップが再変換されます。

デモンストレーション

Scalaマップ

scala> val scalaMap = Map(1 -> Map('a -> "A"), 2 -> Map('b -> "B"))

Javaマップへの変換(ただし、内部マップを変換するたびに何かを出力します)

scala> val javaMapBad = scalaMap.mapValues(v => { println("evaluating "+v); v.asJava }).asJava
evaluating Map('a -> A)
evaluating Map('b -> B)
javaMapBad: java.util.Map[Int,java.util.Map[Symbol,java.lang.String]] = {1={'a=A}, 2={'b=B}}

scala> javaMapBad.get(1)
evaluating Map('a -> A)     // Re-conversion!
res0: java.util.Map[Symbol,java.lang.String] = {'a=A}

scala> javaMapBad.get(1)
evaluating Map('a -> A)     // Re-conversion!
res1: java.util.Map[Symbol,java.lang.String] = {'a=A}

それを行う正しい方法

scala> val javaMapGood = scalaMap.map{case (k,v) => {println("evaluating "+v); (k,v.asJava)}}.asJava
evaluating Map('a -> A)
evaluating Map('b -> B)
javaMapGood: java.util.Map[Int,java.util.Map[Symbol,java.lang.String]] = {1={'a=A}, 2={'b=B}}

scala> javaMapGood.get(1)  // no re-conversion
res6: java.util.Map[Symbol,java.lang.String] = {'a=A}

scala> javaMapGood.get(1)  // no re-conversion
res7: java.util.Map[Symbol,java.lang.String] = {'a=A}
于 2012-10-05T20:17:09.827 に答える