首页 文章

如何从Java列表中获取Scala列表?

提问于
浏览
124

我有一个返回List的Java API,如:

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 . 如何在上述背景下做到这一点?

5 回答

  • 7

    有一个方便的Scala对象只是为了这个 - scala.collection.JavaConverters

    你可以按照以下方式进行导入和 asScala

    import scala.collection.JavaConverters._
    
    val lst = node.getByXPath(xpath).asScala
    lst.foreach{ node =>   .... }
    

    这应该给你Scala的 Buffer 表示允许你完成 foreach .

  • 166

    我一直在寻找用Java编写的答案,但令人惊讶的是在这里找不到任何干净的解决方案 . 过了一段时间我才弄明白所以我决定在这里添加它以防万一其他人正在寻找Java实现(我想它也适用于Scala?):

    JavaConversions.asScalaBuffer(myJavaList).toList()
    
  • 80

    如果必须将Java List<ClassA> 转换为Scala 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))
       }
    }
    
  • 4

    Scala 2.8 以来,此转换现已内置于语言中,使用:

    import scala.collection.JavaConversions._
    
    ...
    
    lst.toList.foreach{ node =>   .... }
    

    作品 . asScala 没用

  • 7

    由于scala 2.8.1使用 JavaConverters._ 来使用asScala和asJava方法转换scala和Java集合 .

    import scala.collection.JavaConverters._

    javalist.asScala

    scalaSeq.asJava

    请参阅转换关系scala doc site

相关问题