在Java中使用scala映射

在Java中使用scala映射,java,scala,scala-collections,Java,Scala,Scala Collections,我有两个文件。一个是scala,另一个是java Scala文件有一个返回Scala不可变映射的函数 Java文件希望将该映射用作字典 我是scala和java的新手。如何将scala映射转换为java Diciary?使用java的静态转发器。在Scala 2.13中,API被简化,使用重载的asJava转换为Java: $ javap -cp ~/scala-2.13.0/lib/scala-library.jar scala.jdk.javaapi.CollectionConverters

我有两个文件。一个是scala,另一个是java

Scala文件有一个返回Scala不可变映射的函数

Java文件希望将该映射用作字典


我是scala和java的新手。如何将scala映射转换为java Diciary?

使用java的静态转发器。在Scala 2.13中,API被简化,使用重载的
asJava
转换为Java:

$ javap -cp ~/scala-2.13.0/lib/scala-library.jar scala.jdk.javaapi.CollectionConverters
Compiled from "CollectionConverters.scala"
public final class scala.jdk.javaapi.CollectionConverters {
  public static scala.collection.mutable.Map<java.lang.String, java.lang.String> asScala(java.util.Properties);
  public static <A, B> scala.collection.mutable.Map<A, B> asScala(java.util.Dictionary<A, B>);
  public static <A, B> scala.collection.concurrent.Map<A, B> asScala(java.util.concurrent.ConcurrentMap<A, B>);
  public static <A, B> scala.collection.mutable.Map<A, B> asScala(java.util.Map<A, B>);
  public static <A> scala.collection.mutable.Set<A> asScala(java.util.Set<A>);
  public static <A> scala.collection.mutable.Buffer<A> asScala(java.util.List<A>);
  public static <A> scala.collection.Iterable<A> asScala(java.util.Collection<A>);
  public static <A> scala.collection.Iterable<A> asScala(java.lang.Iterable<A>);
  public static <A> scala.collection.Iterator<A> asScala(java.util.Enumeration<A>);
  public static <A> scala.collection.Iterator<A> asScala(java.util.Iterator<A>);
  public static <K, V> java.util.concurrent.ConcurrentMap<K, V> asJava(scala.collection.concurrent.Map<K, V>);
  public static <K, V> java.util.Map<K, V> asJava(scala.collection.Map<K, V>);
  public static <K, V> java.util.Dictionary<K, V> asJavaDictionary(scala.collection.mutable.Map<K, V>);
  public static <K, V> java.util.Map<K, V> asJava(scala.collection.mutable.Map<K, V>);
  public static <A> java.util.Set<A> asJava(scala.collection.Set<A>);
  public static <A> java.util.Set<A> asJava(scala.collection.mutable.Set<A>);
  public static <A> java.util.List<A> asJava(scala.collection.Seq<A>);
  public static <A> java.util.List<A> asJava(scala.collection.mutable.Seq<A>);
  public static <A> java.util.List<A> asJava(scala.collection.mutable.Buffer<A>);
  public static <A> java.util.Collection<A> asJavaCollection(scala.collection.Iterable<A>);
  public static <A> java.lang.Iterable<A> asJava(scala.collection.Iterable<A>);
  public static <A> java.util.Enumeration<A> asJavaEnumeration(scala.collection.Iterator<A>);
  public static <A> java.util.Iterator<A> asJava(scala.collection.Iterator<A>);
}
$javap-cp~/scala-2.13.0/lib/scala-library.jar scala.jdk.javaapi.CollectionConverters
从“CollectionConverters.scala”编译而来
公共最终类scala.jdk.javaapi.CollectionConverters{
公共静态scala.collection.mutable.Map asScala(java.util.Properties);
公共静态scala.collection.mutable.Map asScala(java.util.Dictionary);
公共静态scala.collection.concurrent.Map asScala(java.util.concurrent.ConcurrentMap);
公共静态scala.collection.mutable.Map asScala(java.util.Map);
公共静态scala.collection.mutable.Set asScala(java.util.Set);
公共静态scala.collection.mutable.Buffer asScala(java.util.List);
公共静态scala.collection.Iterable asScala(java.util.collection);
公共静态scala.collection.Iterable asScala(java.lang.Iterable);
公共静态scala.collection.Iterator asScala(java.util.Enumeration);
公共静态scala.collection.Iterator asScala(java.util.Iterator);
公共静态java.util.concurrent.ConcurrentMap asJava(scala.collection.concurrent.Map);
公共静态java.util.Map asJava(scala.collection.Map);
公共静态java.util.Dictionary作为JavaDictionary(scala.collection.mutable.Map);
公共静态java.util.Map asJava(scala.collection.mutable.Map);
公共静态java.util.Set asJava(scala.collection.Set);
公共静态java.util.Set asJava(scala.collection.mutable.Set);
公共静态java.util.List asJava(scala.collection.Seq);
公共静态java.util.List asJava(scala.collection.mutable.Seq);
公共静态java.util.List asJava(scala.collection.mutable.Buffer);
公共静态java.util.Collection作为JavaCollection(scala.Collection.Iterable);
公共静态java.lang.Iterable asJava(scala.collection.Iterable);
公共静态java.util.Enumeration作为JavaEnumeration(scala.collection.Iterator);
公共静态java.util.Iterator asJava(scala.collection.Iterator);
}
给定一个返回Scala映射的Scala类:

$ jshell --class-path .:~/scala-2.13.0/lib/scala-library.jar 
|  Welcome to JShell -- Version 11.0.3
|  For an introduction type: /help intro

jshell> Map<String, String> vs = scala.jdk.javaapi.CollectionConverters.asJava(new mytools.MapMaker().m())
vs ==> {greeting=hi, reply=bye}
$jshell——类路径。~/scala-2.13.0/lib/scala-library.jar
|欢迎使用JShell——11.0.3版
|对于介绍类型:/help intro
jshell>Map vs=scala.jdk.javaapi.CollectionConverters.asJava(新的mytools.MapMaker().m())
vs==>{问候=你好,回复=再见}

这是将Scala immutable.Map转换为Java中的Java映射的更好方法

java.util.Map<String, String> javaMap = scala.collection.JavaConverters
                                           .mapAsJavaMapConverter(scalaMap).asJava();
java.util.Map javaMap=scala.collection.JavaConverters
.mapAsJavaMapConverter(scalaMap).asJava();

您的项目是Java还是Scala?它是Scala。我将sbt用于buildAs作为一个注释,在新代码中永远不要使用字典或哈希表,除非与需要它的古老代码接口。使用Map接口(通常是HashMap),我使用的是用scala编写的库。我的代码是用java编写的。我不希望scala文件中有任何臃肿的助手函数。非常感谢您的回答。从哪里可以获得这些语法类型的信息?有线索吗?