尝试将 HashMap 转换为 Scala ListMap
Trying to convert a HashMap into a scala ListMap
所以,有一个特定的 class,我在某个框架中覆盖它(不相关,但它是 Play 的 SecureSocial 框架)。我覆盖的方法具有签名:
在 Scala 中:
override val providers : scala.collection.immutable.ListMap[scala.Predef.String, securesocial.core.IdentityProvider] = { /* compiled code */ }
所以,我简单的写成:
@Override
ListMap<String, IdentityProvider> providers() { ... }
问题是我唯一能用 Java 中的 ListMap
做的是:
new ListMap<>();
这不是很有用。我想要覆盖的 Map
是通过 DI 注入的,而我拥有的是 java.util.HashMap
。所以,我的方法是这样的:
@Override
ListMap<String, IdentityProvider> providers() {
Map<String, IdentityProvider> providerMap = this.providerMap;
toScalaListMap(providerMap);
}
当然,toScalaListMap
是不存在的。我该如何着手编写它?我试过在线搜索并查看 Scala 文档,但鉴于我目前对 Scala 的了解为零,我不知道从哪里开始。为了以防万一,我在这个问题中添加了 securesocial
标签。
在 Java collection 上有一个 asScala
方法可用,详见 scala 文档 here。只需在 collection 上调用它即可为您完成转换。
我解决这个问题的方法是使用这样的东西:
return (ListMap<String, IdentityProvider>)new ListMap<String, IdentityProvider>()
.newBuilder()
.$plus$eq(new Tuple2<>("provider1", provider1))
.$plus$eq(new Tuple2<>("provider2", provider2))
.result();
其中 Tuple2
本质上是 scala.Tuple2
。它很丑,但它有效!
所以,有一个特定的 class,我在某个框架中覆盖它(不相关,但它是 Play 的 SecureSocial 框架)。我覆盖的方法具有签名:
在 Scala 中:
override val providers : scala.collection.immutable.ListMap[scala.Predef.String, securesocial.core.IdentityProvider] = { /* compiled code */ }
所以,我简单的写成:
@Override
ListMap<String, IdentityProvider> providers() { ... }
问题是我唯一能用 Java 中的 ListMap
做的是:
new ListMap<>();
这不是很有用。我想要覆盖的 Map
是通过 DI 注入的,而我拥有的是 java.util.HashMap
。所以,我的方法是这样的:
@Override
ListMap<String, IdentityProvider> providers() {
Map<String, IdentityProvider> providerMap = this.providerMap;
toScalaListMap(providerMap);
}
当然,toScalaListMap
是不存在的。我该如何着手编写它?我试过在线搜索并查看 Scala 文档,但鉴于我目前对 Scala 的了解为零,我不知道从哪里开始。为了以防万一,我在这个问题中添加了 securesocial
标签。
在 Java collection 上有一个 asScala
方法可用,详见 scala 文档 here。只需在 collection 上调用它即可为您完成转换。
我解决这个问题的方法是使用这样的东西:
return (ListMap<String, IdentityProvider>)new ListMap<String, IdentityProvider>()
.newBuilder()
.$plus$eq(new Tuple2<>("provider1", provider1))
.$plus$eq(new Tuple2<>("provider2", provider2))
.result();
其中 Tuple2
本质上是 scala.Tuple2
。它很丑,但它有效!