一尘不染

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

java

我发现有很多人试图这样做,并对此进行了询问,但始终会使用scala代码来回答问题。我需要调用一个需要scala.collection.immutable.Map的API,但是我有一个java.util.Map,如何在我的Java代码中将后者从后者转换为前者?编译器不同意这种说法是一种隐式转换,因为当我尝试它时会否定它!

谢谢!


阅读 208

收藏
2020-12-03

共1个答案

一尘不染

获取不可变的Scala映射有些棘手,因为collections库提供的转换返回的都是可变的返回值,您不能只使用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方面来说,基本上每个人都希望该废话会尽快被弃用,因此即使在这里我也避免这样做。

2020-12-03