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

kq0g1dla  于 2023-10-18  发布在  Scala
关注(0)|答案(3)|浏览(134)

在Java中,我已经有了一个scala.collection.mutable.wrappedArray对象。如何在Java中将其转换为util.ArrayListutil.linkedList?或者,我如何将它重新命名,并对它的每个值做些什么?foreach不适用。

qyyhg6bp

qyyhg6bp1#

我不想声称从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();
vjhs03f7

vjhs03f72#

这就是我在Java中所做的:

import scala.collection.JavaConverters;
/* ... */
JavaConverters.mutableSeqAsJavaList(yourArray.seq());

据我所知,一旦你有任何使用Scala的库(特别是你想转换数据的库),scala.*包自然会进入类路径。

i7uaboj4

i7uaboj43#

这是一个古老的答案。正确的使用方法如下所示

import scala.jdk.CollectionConverters.*
val javaList: java.util.List[Int] = Array(1, 2, 3).toList.asJava

相关问题