2011-06-15 94 views
112

我有一個Java API返回像列表:如何從Java列表中獲取Scala列表?

public List<?> getByXPath(String xpathExpr) 

我使用下面的Scala代碼:

val lst = node.getByXPath(xpath) 

現在,如果我嘗試Scala的語法糖,如:

lst.foreach{ node => ... } 

它不起作用。我得到的錯誤:

value foreach is not a member of java.util.List[?0] 

看來我需要將Java List轉換爲Scala List。如何在上述情況下做到這一點?

+1

[轉換Java集合到Scala中收集]的可能重複(http://stackoverflow.com/questions/674713 /轉換java集合到斯卡拉集合) – 2011-06-15 11:00:26

+0

@Kim:我不知道這是適當的關閉此作爲重複的特別的問題 - 這個特定的問題談論了Scala 2.7,並且scala.collection.jcl包在Scala 2.8和2.9中不再存在。 – 2011-06-15 15:08:10

回答

156

由於斯卡拉2.8這個轉換現在內置使用的語言:

import scala.collection.JavaConversions._ 

... 

lst.toList.foreach{ node => .... } 

作品。 asScala沒有工作

+5

你能詳細說明爲什麼asScala不起作用嗎? – 2012-07-19 11:01:13

+11

在2.10.4上我必須導入scala.collection.JavaConverters._,否則我得到「值asScala不是java.util.List [String]的成員」 – dranxo 2014-05-23 23:27:04

+6

'JavaConversions'從2.12.0開始已被棄用。改用'JavaConverters'。 – Yaroslav 2017-04-05 10:47:33

70

有一個方便的斯卡拉對象只爲這 - scala.collection.JavaConverters

你可以做進口和asScala事後如下:

import scala.collection.JavaConverters._ 

val lst = node.getByXPath(xpath).asScala 
lst.foreach{ node => .... } 

這應該給你Scala的Buffer表示允許你完成foreach

+6

JavaConverters應該優先於JavaConversions,因爲它使轉換顯式化(並避免了可能會造成混淆的意外轉換)。 (即,這是正確的答案) – Mark 2014-09-18 17:34:11

7

我一直在尋找用Java編寫的答案,並且出人意料地找不到任何干淨的解決方案。過了一會兒,我能弄清楚,所以我決定在這裏添加它,以防其他人正在尋找的Java實現(我猜它也可以用Scala):

JavaConversions.asScalaBuffer(myJavaList).toList() 
5

如果你有轉換一個Java List<ClassA>到斯卡拉List[ClassB],那麼你就必須做到以下幾點:

1)添加

import scala.collection.JavaConverters._ 

2)使用方法asScalatoList然後map

List <ClassA> javaList = ... 
var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x)) 

3)添加以下到接收ClassA作爲參數ClassB構造:

case class ClassB() { 
   def this (classA: ClassA) { 
      this (new ClassB (classA.getAttr1, ..., classA.getAttrN)) 
   } 
} 
0

因爲階2.8.1用戶JavaConvertest._

Scala和Java中使用asScala集合和作爲Java方法。

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

看到的轉換關係scala doc site