【问题标题】:How to convert a nested complex scala Map to Java如何将嵌套的复杂 scala Map 转换为 Java
【发布时间】:2017-07-05 13:17:01
【问题描述】:

我正在尝试在我的 Java 程序中使用 Scala 库,但在将复杂的 Scala Map 转换为 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 List: scala.collection.JavaConversions.seqAsJavaList(zkUtils.getAllTopics());

【问题讨论】:

  • 您所说的“玩过但没有运气”到底是什么意思?你发现JavaConversions.mapAsJavaMap了吗?使用它有什么“不走运”的地方?
  • java.util.Map&lt;String, Map&lt;Object, Seq&lt;Object&gt;&gt;&gt; stringMapMap = JavaConversions.mapAsJavaMap(map2); 然后转换每个项目应该可以工作吗?
  • 也许应该……也许,你应该,至少尝试一下?

标签: java scala collections


【解决方案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;
}

【讨论】:

  • 当您必须用 java 编写时,没有什么是真正的 nice :( 也许,是时候考虑切换到更好的语言(如 scala)了?添加一些 import文件顶部的语句,并去掉代码中的包名和不必要的强制转换,虽然会使它读起来更好一点。
  • 谢谢!问题是有一个 scala Map 和 Java Map :)
  • 是的,但您不需要每次都将它们都拼出来。在你的 sn-p 中只有一个地方,你必须引用 scala.collection.Map ......如果你跳过 tmpMap 并直接转到 tmpMap2,即使这样也可以避免。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2012-12-08
  • 2019-08-25
  • 1970-01-01
  • 2019-11-20
相关资源
最近更新 更多