How to get Scala List from Java List?

2020-05-11 06:17发布

I have a Java API that returns a List like:

public List<?> getByXPath(String xpathExpr)

I am using the below scala code:

val lst = node.getByXPath(xpath)

Now if I try scala syntax sugar like:

lst.foreach{ node => ... }

it does not work. I get the error:

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

It seems I need to convert Java List to Scala List. How to do that in above context?

标签: java scala
6条回答
做自己的国王
2楼-- · 2020-05-11 07:00

Since scala 2.8.1 use JavaConverters._ to convert scala and Java collections using asScala and asJava methods.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

see the Conversion relationship scala doc site

查看更多
The star\"
3楼-- · 2020-05-11 07:04

I was looking for an answer written in Java and surprisingly couldn't find any clean solutions here. After a while I was able to figure it out so I decided to add it here in case someone else is looking for the Java implementation (I guess it also works in Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList()
查看更多
▲ chillily
4楼-- · 2020-05-11 07:05

EDIT: Note that this is deprecated since 2.12.0. Use JavaConverters instead. (comment by @Yaroslav)

Since Scala 2.8 this conversion is now built into the language using:

import scala.collection.JavaConversions._

...

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

works. asScala did not work

查看更多
走好不送
5楼-- · 2020-05-11 07:11

Shortcut to convert java list to scala list

import scala.collection.JavaConverters._

myjavaList.asScala.toList

查看更多
疯言疯语
6楼-- · 2020-05-11 07:15

If you have to convert a Java List<ClassA> to a Scala List[ClassB], then you must do the following:

1) Add

import scala.collection.JavaConverters._

2) Use methods asScala, toList and then map

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

3) Add the following to the ClassB constructor that receives ClassA as a parameter:

case class ClassB () {
   def this (classA: ClassA) {
      this (new ClassB (classA.getAttr1, ..., classA.getAttrN))
   }
}
查看更多
干净又极端
7楼-- · 2020-05-11 07:16

There's a handy Scala object just for this - scala.collection.JavaConverters

You can do the import and asScala afterwards as follows:

import scala.collection.JavaConverters._

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

This should give you Scala's Buffer representation allowing you to accomplish foreach.

查看更多
登录 后发表回答