【问题标题】:How do I convert a java.util.Map to scala.collection.immutable.Map in Java?如何在 Java 中将 java.util.Map 转换为 scala.collection.immutable.Map?
【发布时间】:2014-08-16 11:27:36
【问题描述】:

我发现很多人试图这样做,并询问这个问题,但这个问题总是用 scala 代码来回答。我需要调用一个期望 scala.collection.immutable.Map 但我有一个 java.util.Map 的 API,如何在我的 java 代码中干净地从后者转换为前者?编译器不同意这是一种隐式转换的观点,因为当我尝试它时它会抱怨!

谢谢!

【问题讨论】:

  • 它在@Jean 帖子中含蓄地回答(见最后)
  • 投票重新打开 - 链接的“重复”不提供不可变部分,无论如何不应使用 JavaConversions

标签: java scala scala-collections scala-java-interop


【解决方案1】:

获取不可变的 Scala 映射有点棘手,因为集合库提供的转换返回的都是可变的,而且您不能只使用 toMap,因为它需要 Java 编译器当然不会的隐式参数'提供。具有该隐式参数的完整解决方案如下所示:

import scala.collection.JavaConverters$;
import scala.collection.immutable.Map;

public class Whatever {
  public <K, V> Map<K, V> convert(java.util.Map<K, V> m) {
    return JavaConverters$.MODULE$.mapAsScalaMapConverter(m).asScala().toMap(
      scala.Predef$.MODULE$.<scala.Tuple2<K, V>>conforms()
    );
  }
}

使用JavaConversions 在 Java 中编写转换更简洁一些,但在 Scala 方面,基本上每个人都希望尽快弃用这种废话,所以即使在这里我也会避免使用它。

【讨论】:

  • 您是否尝试将它与采用 Map[Int, Int] 的 Scala 方法一起使用?因为我得到:actual argument Map&lt;Integer,Integer&gt; cannot be converted to Map&lt;Object,Object&gt; by method invocation conversion
  • @ErikAllik,是的,原语是另一组令人头疼的问题,但是 Java 端的一些 Predef.Integer2int(或其他名称)应该可以工作。如果 OP 表明他们需要这个,我会将其添加到答案中。
  • 我的帖子没有完全回答这个问题,因为需要 java 实现。这个答案可以。赞成。
  • 非常感谢!作为说明,它确实要求您获得最新的 scala 标准库 2.11.0 并且符合似乎已被弃用。但是它现在有效,弃用问题可能是另一天的问题!
  • 哦,太可怕了!现在我看到 Kotlin 人在说“java interop”时谈论什么
猜你喜欢
  • 2011-03-08
  • 2012-08-07
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2010-11-04
  • 1970-01-01
相关资源
最近更新 更多