[英]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.