[英]In Java, how to convert scala.list to java.list
在 Java 中,我已经有一个scala.collection.mutable.wrappedArray
对象。 如何在 Java util.linkedList
其转换为util.ArrayList
或util.linkedList
? 或者,我如何迭代它并对它的每个值做一些事情? foreach
不适用。
我不想声称从你的 Java 代码中使用scala.collection.mutable.wrappedArray
是“不可能的”,但在我看来,如果你问这样的问题,你就错了。
Scala 的标准库确实提供了很多功能来在 Scala 数据结构和 Java 数据结构之间进行转换。
Java 标准库不提供任何工具来处理 Scala 集合,它对 Scala 一无所知。
因此, “如何在 Java scala.xyZ
java.rsT
转换为java.rsT
”这个问题本质上是没有意义的:不要尝试在 Java 中执行转换,在 Scala 中进行转换,它会容易得多。
一般的做法
假设您有一个在 Scala 中实现的方法foo
,它返回一个特定于 Scala 的数据结构scala.xyZ
:
// 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();
这就是我最终做的(在 Java 中):
import scala.collection.JavaConverters;
/* ... */
JavaConverters.mutableSeqAsJavaList(yourArray.seq());
据我所知,一旦您拥有任何使用 Scala 的库(特别是您想要从中转换数据的库), scala.*
包自然会进入类路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.