Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Scala-2.13在Java代码中将Java映射转换为Scala不可变映射_Java_Scala_Dictionary_Scala 2.13 - Fatal编程技术网

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

使用Scala-2.13在Java代码中将Java映射转换为Scala不可变映射,java,scala,dictionary,scala-2.13,Java,Scala,Dictionary,Scala 2.13,我想将java映射转换为Scala不可变映射,我有一个示例代码,可以正确地使用Scala 2.12,但在Scala 2.13中失败 设置 untitled14\build.sbt name := "untitled14" version := "0.1" scalaVersion := "2.12.13" sbt.version = 1.4.1 import scala.Predef; import scala.Tuple2; im

我想将java映射转换为Scala不可变映射,我有一个示例代码,可以正确地使用Scala 2.12,但在Scala 2.13中失败

设置

untitled14\build.sbt

name := "untitled14"
version := "0.1"
scalaVersion := "2.12.13"
sbt.version = 1.4.1
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);
    }
}
name := "untitled14"
version := "0.1"
scalaVersion := "2.13.3"
untitled14\project\build.properties

name := "untitled14"
version := "0.1"
scalaVersion := "2.12.13"
sbt.version = 1.4.1
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);
    }
}
name := "untitled14"
version := "0.1"
scalaVersion := "2.13.3"
untitled14\src\main\java\main.java

name := "untitled14"
version := "0.1"
scalaVersion := "2.12.13"
sbt.version = 1.4.1
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);
    }
}
name := "untitled14"
version := "0.1"
scalaVersion := "2.13.3"
输出

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

name := "untitled14"
version := "0.1"
scalaVersion := "2.12.13"
sbt.version = 1.4.1
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);
    }
}
name := "untitled14"
version := "0.1"
scalaVersion := "2.13.3"
我执行的命令

sbt run
sbt clean compile
输出

Java map -> {1=java, 2=scala, 3=js}
Scala map -> Map(1 -> java, 2 -> scala, 3 -> js)
编撰

[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
能告诉我如何正确地做吗


注意:-我正在使用
jvm-14、sbt-1.4.1、scala-2.13.3
自己找到解决方案,只需使用
$less$colon$less$.MODULE$.refl()
而不是
Predef.confirms()

导入scala.$less$colon$less$;
导入scala.jdk.CollectionConverters;
导入java.util.HashMap;
导入java.util.Map;
公共班机{
公共静态void main(字符串[]args){
Map javaMap=newhashmap();
put(1,“java”);
put(2,“scala”);
javaMap.put(3,“js”);
System.out.println(“javaMap->”+javaMap);
scala.collection.immutable.Map scalaMap=CollectionConverters
.maphasassascala(javaMap)
.asScala()
.toMap($减去冒号$减去$.MODULE$.refl());
System.out.println(“Scala映射->”+scalaMap);
}
}

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

scala.collection.immutable.Map scalaMap=
scala.collection.immutable.Map.from(scala.jdk.CollectionConverters.maphasassascala(javaMap.asScala());

java代码中没有隐式的概念。隐式仅在scala代码中表示完整。编写一个执行转换的scala函数并从Java调用通常更容易。这只是一个技巧,如果我们可以使用scala-2.12实现,那么也可以使用scala-2.13实现。在我看来,用scala编写一个函数并从java调用它只是开销@路易斯米盖尔梅杰亚斯亚雷斯