首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Scala-2.13将Java映射转换为Java代码中的Scala不变映射

用Scala-2.13将Java映射转换为Java代码中的Scala不变映射
EN

Stack Overflow用户
提问于 2021-01-15 12:38:53
回答 2查看 956关注 0票数 3

我想把我的java映射转换成Scala不变的映射,我有一个示例代码,它可以正确地使用Scala2.12,但是在Scala2.13中失败。

设置

untitled14\build.sbt

代码语言:javascript
复制
name := "untitled14"
version := "0.1"
scalaVersion := "2.12.13"

untitled14\project\build.properties

代码语言:javascript
复制
sbt.version = 1.4.1

untitled14\src\main\java\Main.java

代码语言:javascript
复制
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);
    }
}

我已执行的命令

代码语言:javascript
复制
sbt run

输出

代码语言:javascript
复制
Java map -> {1=java, 2=scala, 3=js}
Scala map -> Map(1 -> java, 2 -> scala, 3 -> js)

因此,您可以从上面看到,代码100%正确工作。

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

untitled14\build.sbt

代码语言:javascript
复制
name := "untitled14"
version := "0.1"
scalaVersion := "2.13.3"

我已执行的命令

代码语言:javascript
复制
sbt clean compile

输出

编译

代码语言:javascript
复制
[info] compiling 1 Java source to D:\untitled14\target\scala-2.13\classes ...
[error] D:\untitled14\src\main\java\Main.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

我试着用

代码语言:javascript
复制
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);
    }
}

但是得到了错误输出

代码语言:javascript
复制
[info] compiling 1 Java source to D:\untitled14\target\scala-2.13\classes ...
[error] D:\untitled14\src\main\java\Main.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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-16 13:11:17

在Scala2.13中有一个非常简单的解决方案:

代码语言:javascript
复制
scala.collection.immutable.Map<Integer, String> scalaMap =
        scala.collection.immutable.Map.from(scala.jdk.CollectionConverters.MapHasAsScala(javaMap).asScala());
票数 3
EN

Stack Overflow用户

发布于 2021-01-15 13:30:38

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

代码语言:javascript
复制
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);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65736291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档