2011-06-15 35 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