วิธีรับ Scala List จาก Java List


134

ฉันมี Java API ที่ส่งคืนรายการเช่น:

public List<?> getByXPath(String xpathExpr)

ฉันใช้รหัส scala ด้านล่าง:

val lst = node.getByXPath(xpath)

ตอนนี้ถ้าฉันลองน้ำตาลไวยากรณ์ของสกาล่าเช่น:

lst.foreach{ node => ... }

มันไม่ทำงาน. ฉันได้รับข้อผิดพลาด:

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

ดูเหมือนว่าฉันต้องแปลงรายการ Java เป็นรายการ Scala จะทำอย่างไรในบริบทข้างต้น?



@ คิม: ฉันไม่แน่ใจว่ามันเหมาะสมหรือไม่ที่จะปิดสิ่งนี้เนื่องจากซ้ำกับคำถามนั้น ๆ - คำถามนั้นพูดถึงสกาล่า 2.7 และแพ็คเกจ scala.collection.jcl ไม่มีอีกแล้วใน Scala 2.8 และ 2.9
Ken Bloom

คำตอบ:


179

แก้ไข: โปรดทราบว่าสิ่งนี้เลิกใช้แล้วตั้งแต่ 2.12.0 ใช้JavaConvertersแทน (แสดงความคิดเห็นโดย @Yaroslav)

เนื่องจากScala 2.8การแปลงนี้ถูกสร้างขึ้นในภาษาโดยใช้:

import scala.collection.JavaConversions._

...

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

ได้ผล asScalaไม่ทำงาน

ในการใช้ 2.12.x import scala.collection.JavaConverters._

ในการใช้ 2.13.x import scala.jdk.CollectionConverters._


14
ในวันที่ 2.10.4 ฉันต้องนำเข้า scala.collection.JavaConverters._ ไม่เช่นนั้นฉันได้รับ "ค่า asScala ไม่ใช่สมาชิกของ java.util.List [String]"
dranxo

11
JavaConversionsเลิกใช้งานตั้งแต่ 2.12.0 ใช้JavaConvertersแทน
Yaroslav

5
สำหรับ 2.13.x คุณต้องใช้import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Nikolaos Georgiou

93

มีวัตถุ Scala ที่มีประโยชน์สำหรับสิ่งนี้ - scala.collection.JavaConverters

คุณสามารถดำเนินการนำเข้าและasScalaหลังจากนั้นได้ดังนี้:

import scala.collection.JavaConverters._

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

สิ่งนี้ควรทำให้คุณเป็นBufferตัวแทนของ Scala ที่ช่วยให้คุณทำสำเร็จforeachได้


7
JavaConverters ควรเป็นที่ต้องการมากกว่า JavaConversions เนื่องจากทำให้การแปลงมีความชัดเจน (และหลีกเลี่ยงการแปลงโดยไม่ได้ตั้งใจที่อาจทำให้สับสน) (กล่าวคือนี่คือคำตอบที่ถูกต้อง)
มาระโก

เนื่องจาก scala 2.13 คลาสนี้เลิกใช้แล้วเช่นกัน ใช้ scala.jdk.CollectionConverters แทน
dev-null

9

ฉันกำลังมองหาคำตอบที่เขียนใน Java และไม่พบโซลูชันที่สะอาดที่นี่ หลังจากนั้นไม่นานฉันก็สามารถคิดออกได้ดังนั้นฉันจึงตัดสินใจเพิ่มที่นี่ในกรณีที่มีคนอื่นกำลังมองหาการใช้งาน Java (ฉันเดาว่ามันใช้ได้กับ Scala ด้วย?):

JavaConversions.asScalaBuffer(myJavaList).toList()

9

หากคุณต้องแปลง Java List<ClassA>เป็น Scala List[ClassB]คุณต้องทำสิ่งต่อไปนี้:

1) เพิ่ม

import scala.collection.JavaConverters._

2) วิธีการใช้งานasScala, toListและจากนั้นmap

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

3) เพิ่มสิ่งต่อไปนี้ให้กับตัวClassBสร้างที่รับClassAเป็นพารามิเตอร์:

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.