在Java中,如何将scala.list转换为java.list

时间:2018-06-24 21:27:45

标签: java scala scala-java-interop

在Java中,我已经有一个scala.collection.mutable.wrappedArray对象。如何在Java中将其转换为util.ArrayListutil.linkedList?或者,我如何迭代它并对其每个值进行处理? foreach不适用。

2 个答案:

答案 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.*包就自然会进入类路径。