Java Listesinden Scala List nasıl alınır?


133

Aşağıdaki gibi bir liste döndüren bir Java API var:

public List<?> getByXPath(String xpathExpr)

Aşağıdaki scala kodunu kullanıyorum:

val lst = node.getByXPath(xpath)

Şimdi eğer sen gibi scala sözdizimi şekeri denerseniz:

lst.foreach{ node => ... }

İşe yaramıyor. Hatayı alıyorum:

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

Java Listesini Scala Listesine dönüştürmem gerekiyor gibi görünüyor. Yukarıdaki bağlamda nasıl yapılır?



@Kim: Bunu belirli bir sorunun kopyası olarak kapatmanın uygun olmadığından emin değilim - bu soru Scala 2.7 hakkında konuşuyor ve scala.collection.jcl paketi Scala 2.8 ve 2.9'da artık mevcut değil.
Ken Bloom

Yanıtlar:


177

EDIT: Bunun 2.12.0'dan beri kullanımdan kaldırıldığını unutmayın. JavaConvertersBunun yerine kullanın . (@Yaroslav tarafından yapılan yorum)

Scala 2.8'den beri bu dönüşüm şu şekilde dilde oluşturulmuştur:

import scala.collection.JavaConversions._

...

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

İşler. asScalaişe yaramadı


13
2.10.4 üzerinde scala.collection.JavaConverters._ ithal etmek zorunda kaldı aksi takdirde "değer var asScala java.util.List [String]" üyesi değil
dranxo 23:14

11
JavaConversions2.12.0'dan beri kullanımdan kaldırılmıştır. JavaConvertersBunun yerine kullanın .
Yaroslav

4
2.13.x için import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Nikolaos Georgiou

92

Bunun için kullanışlı bir Scala nesnesi var - scala.collection.JavaConverters

İçe aktarma işlemini ve asScaladaha sonra aşağıdaki gibi yapabilirsiniz:

import scala.collection.JavaConverters._

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

Bu size Scala'nın Buffertemsil etmenizi sağlamalıdır foreach.


7
JavaConverters, dönüşümü açık hale getirdiğinden (ve kafa karıştırıcı olabilecek yanlışlıkla dönüşümleri engellediğinden) JavaConversions'a göre tercih edilmelidir. (Yani, bu doğru cevaptır)
Mark

scala 2.13'ten beri bu sınıf da kullanımdan kaldırılmıştır. Bunun yerine scala.jdk.CollectionConverters kullanın.
dev-null

9

Java ile yazılmış bir cevap arıyordum ve şaşırtıcı bir şekilde burada herhangi bir temiz çözüm bulamadım. Bir süre sonra bunu anlayabildim, böylece başka birinin Java uygulamasını araması durumunda buraya eklemeye karar verdim (sanırım Scala'da da çalışıyor mu?):

JavaConversions.asScalaBuffer(myJavaList).toList()

9

Bir Java'yı List<ClassA>Scala'ya dönüştürmeniz List[ClassB]gerekiyorsa, aşağıdakileri yapmanız gerekir:

1) Ekle

import scala.collection.JavaConverters._

2) kullanımı yöntemleri asScala, toListve daha sonramap

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

3) Parametre olarak ClassBalan kurucuya aşağıdakileri ekleyin ClassA:

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

6

Scala JavaConverters._ 2.8.1'den beri asScala ve asJava yöntemlerini kullanarak scala ve Java koleksiyonlarını dönüştürmek için kullanın .

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

Dönüşüm ilişkisi scala doc sitesine bakın


6

Java listesini scala listesine dönüştürmek için kısayol

import scala.collection.JavaConverters._

myjavaList.asScala.toList

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.