使用Scala-2.13在Java代码中将Java映射转换为Scala不可变映射



我想将我的java映射转换为Scala不可变映射,我有一个示例代码,可以在Scala 2.12中正常工作,但在Scala 2.13中失败。

设置> untitled14build.sbt

name := "untitled14"
version := "0.1"
scalaVersion := "2.12.13"

untitled14projectbuild.properties

sbt.version = 1.4.1

untitled14srcmainjavaMain.java

import scala.Predef;
import scala.Tuple2;
import scala.collection.JavaConverters;
import java.util.HashMap;
import java.util.Map;
public class Main {
    public static void main(String[] args) {
        Map<Integer, String> javaMap = new HashMap<>();
        javaMap.put(1, "java");
        javaMap.put(2, "scala");
        javaMap.put(3, "js");
        System.out.println("Java map -> " + javaMap);
        scala.collection.immutable.Map<Integer, String> scalaMap = JavaConverters
                .mapAsScalaMapConverter(javaMap)
                .asScala()
                .toMap(Predef.<Tuple2<Integer, String>>conforms());
        System.out.println("Scala map -> " + scalaMap);
    }
}

我执行的命令

sbt run

Java map -> {1=java, 2=scala, 3=js}
Scala map -> Map(1 -> java, 2 -> scala, 3 -> js)
所以,你可以从上面看到代码100%正确地工作。

现在如果我更新我的 build.sbt 使用scala-2.13.3会出现编译错误。

untitled14build.sbt

name := "untitled14"
version := "0.1"
scalaVersion := "2.13.3"

我执行的命令

sbt clean compile

编译
[info] compiling 1 Java source to D:untitled14targetscala-2.13classes ...
[error] D:untitled14srcmainjavaMain.java:22:1: cannot find symbol
[error]   symbol:   method <scala.Tuple2<java.lang.Integer,java.lang.String>>conforms()
[error]   location: class scala.Predef
[error] Predef.<Tuple2<Integer, String>>conforms
[error] (Compile / compileIncremental) javac returned non-zero exit code
[error] Total time: 1 s, completed 15-Jan-2021, 6:01:18 pm

我试过使用

import scala.jdk.CollectionConverters;
import java.util.HashMap;
import java.util.Map;
public class Main {
    public static void main(String[] args) {
        Map<Integer, String> javaMap = new HashMap<>();
        javaMap.put(1, "java");
        javaMap.put(2, "scala");
        javaMap.put(3, "js");
        System.out.println("Java map -> " + javaMap);
        scala.collection.immutable.Map<Integer, String> scalaMap = CollectionConverters
                .MapHasAsScala(javaMap)
                .asScala()
                .toMap(scala.$less$colon$less.refl());
        System.out.println("Scala map -> " + scalaMap);
    }
}

但是得到错误输出

[info] compiling 1 Java source to D:untitled14targetscala-2.13classes ...
[error] D:untitled14srcmainjavaMain.java:20:1: cannot find symbol
[error]   symbol:   method refl()
[error]   location: class scala.$less$colon$less
[error] scala.$less$colon$less.refl
[error] (Compile / compileIncremental) javac returned non-zero exit code
[error] Total time: 1 s, completed 15-Jan-2021, 6:06:43 pm

有人能告诉我怎么正确地做吗?

注意:- 我使用jvm-14, sbt-1.4.1, scala-2.13.3

在Scala 2.13中有一个非常简单的解决方案:

scala.collection.immutable.Map<Integer, String> scalaMap =
        scala.collection.immutable.Map.from(scala.jdk.CollectionConverters.MapHasAsScala(javaMap).asScala());

找到了自己的解决方案,只是使用$less$colon$less$.MODULE$.refl()而不是Predef.<Tuple2<Integer, String>>conforms()

import scala.$less$colon$less$;
import scala.jdk.CollectionConverters;
import java.util.HashMap;
import java.util.Map;
public class Main {
    public static void main(String[] args) {
        Map<Integer, String> javaMap = new HashMap<>();
        javaMap.put(1, "java");
        javaMap.put(2, "scala");
        javaMap.put(3, "js");
        System.out.println("Java map -> " + javaMap);
        scala.collection.immutable.Map<Integer, String> scalaMap = CollectionConverters
                .MapHasAsScala(javaMap)
                .asScala()
                .toMap($less$colon$less$.MODULE$.refl());
        System.out.println("Scala map -> " + scalaMap);
    }
}

最新更新