首页 > 解决方案 > In Java, how to convert scala.list to java.list

问题描述

In Java, I already have a scala.collection.mutable.wrappedArray object. How can I convert it to util.ArrayList or util.linkedList in Java? Or alternatively, How can I iterate it and do something with each value of it? foreach is not applicable.

标签: javascalascala-java-interop

解决方案


我不想声称scala.collection.mutable.wrappedArray从你的 Java 代码中使用 a 是“不可能的”,但在我看来,如果你问这样的问题,那么你做错了。

Scala 的标准库确实提供了很多功能来在 Scala 数据结构和 Java 数据结构之间进行转换。

Java 标准库没有提供任何工具来处理 Scala 集合,它对 Scala 完全一无所知。

因此,“我如何在 Java 中scala.x.y.Z转换”java.r.s.T 这个问题本质上是没有意义的:不要尝试在 Java 中执行转换,在 Scala 中执行,它会容易得多。


一般的做法

假设你有一个foo在 Scala 中实现的方法,它返回一个 Scala 特定的数据结构scala.x.y.Z

// Scala code
def foo(): scala.x.y.Z = ???

显然,你想要做的是:

// Java code
scala.x.y.Z a = yourScalaLibrary.foo();
java.r.s.T b = /* 
  crazily complex java code
  that converts scaa.x.y.Z to java.r.s.T
*/

我的建议是:不要这样做。相反,在 Scala 中实现一个额外的 Java 特定 API :

// Scala code
def javaFoo(): java.r.s.T = {
  scala.x.y.Z a = foo()
  java.r.s.T b = /* simple conversion code using Scala-Java interop */
  b  // return Java-specific collection
}

然后在您的 Java 代码中仅使用 Java-API:

// Java code
java.r.s.T b = javaFoo();

具体例子

假设您想从 Java 中使用此方法:

def foo(): scala.collection.mutable.WrappedArray[Int] = Array(1, 2, 3)

您首先实现一个 java-API(在 Scala 中!):

import collection.JavaConverters._
def javaFoo(): java.util.List[Int] = foo().asJava

然后从 Java 中使用它:

java.util.List myList = javaFoo();

推荐阅读