作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们在尝试使用 Java 中的 Scala 代码时遇到了问题。我们正在寻找一种方法来自动桥接各种 Scala 和 java 集合,而无需在我们的 Java 代码中进行显式转换。本地方很少时,这样做是合理的,但如果它广泛传播并不断添加新的 scala 类,它就会变得不切实际。
例如,在我们的 Scala 代码中,我们有一些这样的类(其中很多):
case class Product(id: String, group: String, attributes : Map[String,String])
def fooWithProducts(products : Seq[Product]) = ...
// create a product
val p1 = Product("id1","group1", Map("attribute1" -> "value1","attribute2" -> "value2")
val p2 = Product("id2","group1", Map("attribute1" -> "value1","attribute2" -> "value2")
fooWithProducts(Seq(p1,p2))
// JAVA
// create a product
HashMap<String, String> attributes = new HashMap<String, String>();
attributes.put("my-attribute","my-value");
// create a scala collection
scala.collection.immutable.Map<String, String> scalaAttributes = Conversions.toScalaImmutableMap(attributes);
// create a product
Product p = Product("id","group",scalaAttributes)
// create a scala sequence of product
ArrayList<Product> dataFeedsProducts = new ArrayList<Product>();
dataFeedsProducts.add(Product);
Seq<Product> seq = JavaConversions.asScalaBuffer(dataFeedsProducts).seq();
fooWithProducts(seq)
// SCALA helpers
public class Conversions {
//https://stackoverflow.com/questions/11903167/convert-java-util-hashmap-to-scala-collection-immutable-map-in-java/11903737#11903737
@SuppressWarnings("unchecked")
/**
* Transforms a java map to a scala immutable map
*/
public static <K, V> scala.collection.immutable.Map<K, V> toScalaImmutableMap(java.util.Map<K, V> javaMap) {
final java.util.List<scala.Tuple2<K, V>> list = new java.util.ArrayList(javaMap.size());
for (final java.util.Map.Entry<K, V> entry : javaMap.entrySet()) {
list.add(scala.Tuple2.apply(entry.getKey(), entry.getValue()));
}
final scala.collection.Seq<Tuple2<K, V>> seq = scala.collection.JavaConverters.asScalaBufferConverter(list).asScala().toSeq();
return (scala.collection.immutable.Map<K, V>) scala.collection.immutable.Map$.MODULE$.apply(seq);
}
/**
* transforms a scala map to the java counterpart
*/
public static <K,V> java.util.Map<K,V> mapAsJavaMap(scala.collection.immutable.Map<K,V> m) {
if (m == null) {
return null;
}
return JavaConversions.mapAsJavaMap(m);
}
public static<A> Seq<A> asScalaSeq(java.util.List<A> l) {
return JavaConversions.asScalaBuffer(l).toSeq();
}
}
最佳答案
大多数用 Scala 编写但应该在 Scala 和 Java 中使用的框架都有一个单独的 Java API。例如,Akka、Play 和 Spark 就是这种情况。
这样做是因为有太多的 Scala 构造不能自然地映射到 Java 中可用的任何内容。虽然从 Java 实例化 Scala 类并非完全不可能,但直接这样做会导致非常不习惯和繁琐的 Java 代码。因此,设计人员并没有将将 Java 数据结构转换为 Scala 数据结构的负担转移给 API 的用户,而是简单地创建一个单独的 Java API,并一劳永逸地解决所有转换和工厂方法的问题。
也就是说,而不是
foobar.api.java
打包到你的库中,实现一个单独的 Java API,仍然使用 Scala (痛单) Product
s 可以方便地从 Java 实例化:JavaConversions
, 调用构造函数 */fooWithProducts
可以从Java调用fooWithProducts
关于java - 如何将 Scala 案例类和集合桥接到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48619101/
我是一名优秀的程序员,十分优秀!