如何在java中将java.util.Map转换为scala.collection.immutable.Map?

如何在java中将java.util.Map转换为scala.collection.immutable.Map?,java,scala,scala-collections,scala-java-interop,Java,Scala,Scala Collections,Scala Java Interop,我发现很多人都在尝试这样做,并且询问这个问题,但是这个问题总是用scala代码来回答。我需要调用一个需要scala.collection.immutable.Map的API,但我有一个java.util.Map,如何在java代码中从后者干净地转换为前者?编译器不同意这种观点,即它是一种隐式转换,因为当我尝试它时,它会吐在上面 谢谢大家! 获取不可变的Scala映射有点棘手,因为集合库提供的转换返回的都是可变的,而且不能只使用toMap,因为它需要一个Java编译器当然不会提供的隐式参数。包含该

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


谢谢大家!

获取不可变的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()
    );
  }
}
import scala.collection.JavaConverters$;
导入scala.collection.immutable.Map;
公务舱{
公共映射转换(java.util.Map m){
返回JavaConverters$.MODULE$.mapascalamapconverter(m).asScala().toMap(
scala.Predef$.MODULE$.conforms()
);
}
}

使用Java编写转换比使用
JavaConversions
更简洁,但在Scala方面,基本上每个人都希望这件垃圾会尽快被弃用,所以即使在这里,我也会避免它。

它在@Jean post(见结尾)中含蓄地回答,投票重新打开链接的“副本”不提供不可变部分,而且无论如何也不应该使用
JavaConversions
。您是否尝试将其与采用
Map[Int,Int]
的Scala方法一起使用?因为我得到:
实际参数映射不能通过方法调用转换转换为映射
@ErikAllik,是的,原语是另一组令人头痛的问题,但是Java端的一些
Predef.Integer2int
(或任何调用)应该可以工作。如果OP指出他们需要这个,我会把它添加到答案中。我的帖子没有完全回答这个问题,因为需要java实现。答案是肯定的。向上投票。太棒了,谢谢!值得注意的是,它确实要求您获得最新的scala标准库2.11.0,而且它似乎已被弃用。然而,它现在起作用了,而且弃用问题可能会成为另一天的问题!o、 太可怕了!现在我看到了Kotlin人在说“java互操作”时谈论的内容