在Java中,我已经有一个scala.collection.mutable.wrappedArray
对象。如何在Java中将其转换为util.ArrayList
或util.linkedList
?或者,我如何迭代它并对其每个值进行处理? foreach
不适用。
答案 0 :(得分:2)
我不想断言使用Java代码中的scala.collection.mutable.wrappedArray
是“不可能的”,但是我认为,如果您问这样的问题,那就错了。
Scala的标准库确实提供了许多功能,可以在Scala数据结构和Java数据结构之间进行转换。
Java标准库不不提供任何处理Scala集合的工具,它完全不了解Scala。
因此,问题“如何在Java中将scala.x.y.Z
转换为java.r.s.T
” 本质上是没有意义的:不要尝试执行Java中的转换,在Scala中完成,要容易得多。
常规方法
假设您有一个在Scala中实现的方法foo
,该方法返回了一个特定于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();
答案 1 :(得分:0)
这就是我最终在Java中所做的事情:
import scala.collection.JavaConverters;
/* ... */
JavaConverters.mutableSeqAsJavaList(yourArray.seq());
据我所知,一旦拥有使用Scala的任何库(尤其是您要从中转换数据的库),scala.*
包就自然会进入类路径。