簡體   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