在Java中,我已经有了一个scala.collection.mutable.wrappedArray对象。如何在Java中将其转换为util.ArrayList或util.linkedList?或者,我如何将它重新命名,并对它的每个值做些什么?foreach不适用。
scala.collection.mutable.wrappedArray
util.ArrayList
util.linkedList
foreach
qyyhg6bp1#
我不想声称从Java代码中使用scala.collection.mutable.wrappedArray是“不可能的”,但在我看来,如果您问这样的问题,那么您就做错了。Scala的标准库确实提供了很多在Scala数据结构和Java数据结构之间转换的功能。Java标准库没有提供任何处理Scala集合的工具,它对Scala一无所知。因此,问题 “如何在Java中将scala.x.y.Z转换为java.r.s.T**" 本质上是没有意义的:不要尝试在Java中执行转换,在Scala中执行,这要容易得多。
scala.x.y.Z
java.r.s.T
一般办法
假设你有一个在Scala中实现的方法foo,它返回一个Scala特定的数据结构scala.x.y.Z:
foo
// 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();
vjhs03f72#
这就是我在Java中所做的:
import scala.collection.JavaConverters; /* ... */ JavaConverters.mutableSeqAsJavaList(yourArray.seq());
据我所知,一旦你有任何使用Scala的库(特别是你想转换数据的库),scala.*包自然会进入类路径。
scala.*
i7uaboj43#
这是一个古老的答案。正确的使用方法如下所示
import scala.jdk.CollectionConverters.* val javaList: java.util.List[Int] = Array(1, 2, 3).toList.asJava
3条答案
按热度按时间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* 中实现额外的Java特定API *:
然后在Java代码中只使用Java-API:
具体例子
假设你想从Java中使用这个方法:
首先实现一个java-API(在Scala中!):
然后在Java中使用它:
vjhs03f72#
这就是我在Java中所做的:
据我所知,一旦你有任何使用Scala的库(特别是你想转换数据的库),
scala.*
包自然会进入类路径。i7uaboj43#
这是一个古老的答案。正确的使用方法如下所示