ในscala.collection
มีสองวัตถุที่คล้ายกันมากและJavaConversions
JavaConverters
- ความแตกต่างระหว่างวัตถุทั้งสองนี้คืออะไร?
- ทำไมพวกเขาทั้งสองอยู่?
- เมื่อใดที่ฉันต้องการใช้หนึ่งกับอื่น ๆ
ในscala.collection
มีสองวัตถุที่คล้ายกันมากและJavaConversions
JavaConverters
คำตอบ:
แก้ไข: Java Conversions
ได้@deprecated
ใน Scala 2.13.0 ใช้scala.jdk.CollectionConvertersแทน
JavaConversions
จัดเตรียมชุดของวิธีการโดยนัยที่แปลงระหว่างคอลเลกชัน Java และคอลเลกชันสกาล่าที่เกี่ยวข้องที่ใกล้เคียงที่สุดและในทางกลับกัน สิ่งนี้ทำได้โดยการสร้าง wrappers ที่ใช้อินเทอร์เฟซ Scala และส่งต่อการเรียกไปยังคอลเลกชัน Java พื้นฐานหรืออินเทอร์เฟซ Java การโอนสายไปยังคอลเลกชัน Scala
JavaConverters
ใช้รูปแบบ pimp-my-library เพื่อ“ เพิ่ม” asScala
วิธีการไปยังคอลเลกชัน Java และasJava
วิธีการในคอลเลกชัน Scala ซึ่งกลับ wrapper ที่เหมาะสมกล่าวถึงข้างต้น มันใหม่กว่า (ตั้งแต่รุ่น 2.8.1) มากกว่าJavaConversions
(ตั้งแต่ 2.8) และทำให้การแปลงระหว่างคอลเลกชัน Scala และ Java ชัดเจน ตรงกันข้ามกับสิ่งที่ดาวิดเขียนไว้ในคำตอบของเขาฉันขอแนะนำให้คุณใช้เป็นนิสัยในการใช้JavaConverters
เพราะคุณจะมีโอกาสน้อยที่จะเขียนโค้ดที่ทำให้เกิดการแปลงโดยนัยมากเนื่องจากคุณสามารถควบคุมเฉพาะจุดที่จะเกิดขึ้น : ที่คุณเขียนหรือ.asScala
.asJava
นี่คือวิธีการแปลงที่JavaConverters
ให้:
Pimped Type | Conversion Method | Returned Type
=================================================================================================
scala.collection.Iterator | asJava | java.util.Iterator
scala.collection.Iterator | asJavaEnumeration | java.util.Enumeration
scala.collection.Iterable | asJava | java.lang.Iterable
scala.collection.Iterable | asJavaCollection | java.util.Collection
scala.collection.mutable.Buffer | asJava | java.util.List
scala.collection.mutable.Seq | asJava | java.util.List
scala.collection.Seq | asJava | java.util.List
scala.collection.mutable.Set | asJava | java.util.Set
scala.collection.Set | asJava | java.util.Set
scala.collection.mutable.Map | asJava | java.util.Map
scala.collection.Map | asJava | java.util.Map
scala.collection.mutable.Map | asJavaDictionary | java.util.Dictionary
scala.collection.mutable.ConcurrentMap | asJavaConcurrentMap | java.util.concurrent.ConcurrentMap
—————————————————————————————————————————————————————————————————————————————————————————————————
java.util.Iterator | asScala | scala.collection.Iterator
java.util.Enumeration | asScala | scala.collection.Iterator
java.lang.Iterable | asScala | scala.collection.Iterable
java.util.Collection | asScala | scala.collection.Iterable
java.util.List | asScala | scala.collection.mutable.Buffer
java.util.Set | asScala | scala.collection.mutable.Set
java.util.Map | asScala | scala.collection.mutable.Map
java.util.concurrent.ConcurrentMap | asScala | scala.collection.mutable.ConcurrentMap
java.util.Dictionary | asScala | scala.collection.mutable.Map
java.util.Properties | asScala | scala.collection.mutable.Map[String, String]
หากต้องการใช้การแปลงโดยตรงจาก Java คุณจะดีกว่าวิธีการโทรJavaConversions
โดยตรง เช่น:
List<String> javaList = new ArrayList<String>(Arrays.asList("a", "b", "c"));
System.out.println(javaList); // [a, b, c]
Buffer<String> scalaBuffer = JavaConversions.asScalaBuffer(javaList);
System.out.println(scalaBuffer); // Buffer(a, b, c)
List<String> javaListAgain = JavaConversions.bufferAsJavaList(scalaBuffer);
System.out.println(javaList == javaListAgain); // true
JavaConversions
สะดวกคุณอาจมองข้ามสถานที่ทั้งหมดที่คอมไพเลอร์สามารถแทรกได้ JavaConverters
คุณสามารถควบคุมสถานที่เหล่านั้นด้วย เป็นการสนทนาทั้งหมดเกี่ยวกับการแปลงโดยนัยกับการแปลงที่ชัดเจน
import JavaConversions._
นั้นการแปลงจะไม่เกิดขึ้นดังนั้นคุณจึงสามารถควบคุมสิ่งที่ถูกแปลงได้ หากคุณวางการนำเข้าอย่างถูกต้อง (เมื่อจำเป็น) คุณจะสามารถควบคุมได้อย่างเต็มที่ว่าการแปลงเสร็จสิ้นที่ใด
JavaConverters
คุณมีความปลอดภัยเพิ่มเติมที่ไม่มีอะไรเกิดขึ้นนอกเสียจากคุณจะเขียนไว้อย่างชัดเจน นั่นคือการรักษาความปลอดภัยเพิ่มเติมและนั่นอาจเป็นสาเหตุที่ทำให้คลาสนี้ถูกเพิ่มเข้ามา
สำหรับผู้ที่เชื่อมโยงไปถึงคำถามนี้ตั้งแต่ Scala 2.12.x JavaConversions
ตอนนี้เลิกใช้แล้วและJavaConverters
เป็นวิธีที่ต้องการ
JavaConverters
เลิกใช้แล้วและscala.jdk.CollectionConverters
เป็นวิธีที่ต้องการ;)
ในกาลา 2.13 JavaConverters
ได้รับการเลิกในความโปรดปรานของscala.jdk.CollectionConverters
:
แพคเกจใหม่ ...
scala.jdk
กับวัตถุCollectionConverters
(คอลเลกชัน Java คลาสสิกคล้ายกับcollection.JavaConverters
ใน 2.12)StreamConverters
,FunctionConverters
และOptionConverters
...
ดังที่อธิบายไว้ใน API JavaConversions
คือชุดของการแปลงโดยนัยที่เปลี่ยนคอลเล็กชัน Java เป็นคอลเลกชันสกาล่าที่เกี่ยวข้อง
import collection.JavaConversions._
คุณสามารถใช้มันด้วย เมื่อจำเป็นผู้แปลจะแปลงชุดภาษาจาวาให้เป็นประเภทสกาล่าที่ถูกต้องโดยอัตโนมัติ
JavaConverters
เป็นชุดมัณฑนากรที่ช่วยแปลงคอลเลกชัน java หรือสกาล่าเป็นคอลเลกชันสกาล่าหรือ java โดยใช้asScala
หรือasJava
วิธีการที่จะถูกเพิ่มเข้าไปในคอลเลกชันที่คุณต้องการแปลงโดยปริยาย ในการใช้ตัวแปลงเหล่านี้คุณต้องนำเข้า:
import collection.JavaConverters._
คุณควรจะชอบJavaConversions
เพราะมันใช้งานง่ายกว่า (ไม่จำเป็นต้องใช้asScala
หรือasJava
)