繁体   English   中英

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

[英]In Java, how to convert scala.list to java.list

在 Java 中,我已经有一个scala.collection.mutable.wrappedArray对象。 如何在 Java util.linkedList其转换为util.ArrayListutil.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM