2017-07-05 19 views
-1

JavaプログラムでScalaライブラリを使用しようとしていますが、複雑なスカラ・マップをJavaに変換するのにはいくつかの困難があります。ネストされた複雑なスカラ・マップをJavaに変換する方法

マイ使用Scalaのオブジェクトのメソッドは、以下の戻り値の型を持っていますscala.collection.mutable.Map<String, Map<Object, Seq<Object>>>

私はそのMap<String, Map<Object, List<Object>>>と同等のJavaに変換する方法を教えてください。

私はすでにJavaConversionsとJavaConvertorsパッケージが、運と遊ん:(

public void getPartitionAssignmentForTopics(final List<String> topics) { 
    final Seq<String> seqTopics =   scala.collection.JavaConversions.asScalaBuffer(topics).toList(); 
    scala.collection.mutable.Map<String, Map<Object, Seq<Object>>> map2 = zkUtils 
      .getPartitionAssignmentForTopics(seqTopics); 

    val map:scala.collection.mutable.Map[String, Map[Object, Seq[Object]]] = scala.collection.mutable.Map() 
    map: 
    collection.mutable.Map[String, Map[Object, Seq[Object]]] =Map() 
    map.mapValues(_.mapValues(_.asJava).asJava).asJava 
    res2: 
    java.util.Map[String, java.util.Map[Object, java.util.List[Object]]] ={} 
} 

をこれはコンパイルされません:)

遊んで、私は私がから変換するには、次のコードを使用することを意味しScala Seq to Javaリスト: scala.collection.JavaConversions.seqAsJavaList(zkUtils.getAllTopics());

+0

"遊んだけど運がいい"ってどういう意味ですか?あなたは 'JavaConversions.mapAsJavaMap'を発見しましたか?それを使用することについて "不運"とは何でしたか? – Dima

+0

'java.util.Map >> stringMapMap = JavaConversions.mapAsJavaMap(map2);'次に、すべての項目を変換する必要がありますか? –

+0

多分、それは...多分、あなたは、少なくとも試してみるべきですか? – Dima

答えて

1

私は次のコードで終わった。本当にいいですね:D

public java.util.Map<String, java.util.Map<Integer, java.util.List<Integer>>> getPartitionAssignmentForTopics(final List<String> topics) { 
    final scala.collection.Seq<String> seqTopics = scala.collection.JavaConversions.asScalaBuffer(topics).toList(); 
    scala.collection.mutable.Map<String, scala.collection.Map<Object, scala.collection.Seq<Object>>> tmpMap1 = 
      zkUtils.getPartitionAssignmentForTopics(seqTopics); 

    final java.util.Map<String, java.util.Map<Integer, java.util.List<Integer>>> result = new HashMap<>(); 
    java.util.Map<String, Map<Object, Seq<Object>>> tmpMap2 = JavaConversions.mapAsJavaMap(tmpMap1); 
    tmpMap2.forEach((k1, v1) -> { 
     String topic = (String)k1; 
     java.util.Map<Object, Seq<Object>> objectSeqMap = JavaConversions.mapAsJavaMap(v1); 
     java.util.Map<Integer, List<Integer>> tmpResultMap = new HashMap<>(); 
     objectSeqMap.forEach((k2, v2) -> { 
      Integer tmpInt = (Integer)k2; 
      List<Integer> tmpList = (List<Integer>)(Object)JavaConversions.seqAsJavaList(v2); 
      tmpResultMap.put(tmpInt, tmpList); 
     }); 
     result.put(topic, tmpResultMap); 
    }); 

    return result; 
} 
+0

Javaで書く必要があるときは本当に何もありません(おそらく、スカラーのようなより良い言語に切り替えることを検討する必要があります)? ファイルの上にいくつかの 'import'ステートメントを追加し、コード内に不必要なキャストがあると、少し読んだほうが良いでしょう。 – Dima

+0

ありがとう!問題は、スカラマップとJavaマップがあることです:) –

+0

はい、両方ともスペルする必要はありません時間。 'scala.collection.Map'を参照しなければならないスニペットには1つの場所しかありません。さらに、' tmpMap'をスキップして直接 'tmpMap2'に行くと回避できます。 – Dima

関連する問題