2017-07-05 107 views
-1

我想在我的Java程序中使用Scala庫,並且將複雜的Scala地圖轉換爲Java有一些困難。如何將嵌套的複雜Scala地圖轉換爲Java

我使用Scala的對象方法有以下返回類型:scala.collection.mutable.Map<String, Map<Object, Seq<Object>>>

如何將其轉換成一個相當於Java的Map<String, Map<Object, List<Object>>>

我已經與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到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編寫它時,沒有什麼是真正的_nice_ :(或許,是時候考慮切換到更好的語言(比如scala)了? 在文件頂部添加一些'import'語句,並去掉軟件包名稱並在代碼中不必要的強制轉換,會讓它看起來更好一點。 – Dima

+0

謝謝!問題是有一個scala Map和Java Map :) –

+0

是的,但是你不需要把它們都拼出來時間。在你的代碼片段中只有一個地方,你必須引用'scala.collection.Map' ......並且即使你跳過'tmpMap'並直接轉到'tmpMap2',也可以避免這種情況。 – Dima

相關問題