Trong scala.collection
, có hai đối tượng rất giống nhau JavaConversions
và JavaConverters
.
- Sự khác biệt giữa hai đối tượng này là gì?
- Tại sao cả hai tồn tại?
- Khi nào tôi muốn sử dụng cái này so với cái kia?
Trong scala.collection
, có hai đối tượng rất giống nhau JavaConversions
và JavaConverters
.
Câu trả lời:
EDIT: Java Conversions
có @deprecated
trong Scala 2.13.0. Thay vào đó, hãy sử dụng scala.jdk.CollectionConverters .
JavaConversions
cung cấp một loạt các phương thức ngầm chuyển đổi giữa một bộ sưu tập Java và bộ sưu tập Scala tương ứng gần nhất và ngược lại. Điều này được thực hiện bằng cách tạo các trình bao bọc thực hiện giao diện Scala và chuyển tiếp các cuộc gọi đến bộ sưu tập Java bên dưới hoặc giao diện Java, chuyển tiếp các cuộc gọi đến bộ sưu tập Scala bên dưới.
JavaConverters
sử dụng mô hình thư viện pimp-my-library để bổ sung asScala
phương thức vào các bộ sưu tập Java và asJava
phương thức cho các bộ sưu tập Scala, trả về các trình bao bọc thích hợp đã thảo luận ở trên. Nó mới hơn (kể từ phiên bản 2.8.1) so với JavaConversions
(kể từ 2.8) và làm cho việc chuyển đổi giữa bộ sưu tập Scala và Java trở nên rõ ràng. Trái với những gì David viết trong câu trả lời của mình, tôi khuyên bạn nên tạo thói quen sử dụng JavaConverters
vì bạn sẽ ít có khả năng viết mã tạo ra nhiều chuyển đổi ngầm, vì bạn có thể kiểm soát điểm duy nhất sẽ xảy ra : nơi bạn viết .asScala
hoặc .asJava
.
Đây là phương thức chuyển đổi JavaConverters
cung cấp:
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]
Tuy nhiên, để sử dụng các chuyển đổi trực tiếp từ Java, tốt hơn hết bạn nên gọi các phương thức từ JavaConversions
trực tiếp; ví dụ:
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
thuận tiện, bạn có thể nhanh chóng bỏ qua tất cả các vị trí mà trình biên dịch có thể chèn vào. Bạn kiểm soát những nơi đó với JavaConverters
. Đó là toàn bộ cuộc thảo luận về chuyển đổi ngầm định và rõ ràng.
import JavaConversions._
, chuyển đổi sẽ không xảy ra để bạn có quyền kiểm soát những gì được chuyển đổi. Nếu bạn đặt nhập đúng cách (chỉ khi cần), bạn có toàn quyền kiểm soát nơi chuyển đổi được thực hiện.
JavaConverters
bạn có thêm sự an toàn mà không có gì xảy ra trừ khi bạn viết nó một cách rõ ràng. Đó là một bảo mật bổ sung, và đó có lẽ là lý do tại sao lớp này được thêm vào.
Đối với bất kỳ ai tiếp cận câu hỏi này kể từ Scala 2.12.x, JavaConversions
hiện không được chấp nhận và JavaConverters
là phương pháp được ưa thích.
JavaConverters
không được dùng nữa và scala.jdk.CollectionConverters
là phương pháp được ưa thích;)
Trong Scala 2.13, JavaConverters
đã không được ủng hộ scala.jdk.CollectionConverters
:
... gói mới
scala.jdk
với các đối tượngCollectionConverters
(cổ điển bộ sưu tập Java, tương tự nhưcollection.JavaConverters
trong 2.12),StreamConverters
,FunctionConverters
vàOptionConverters
...
Như đã giải thích trong API, JavaConversions
là một tập hợp các chuyển đổi ngầm định chuyển đổi các bộ sưu tập java thành bộ sưu tập scala có liên quan.
Bạn có thể sử dụng nó với một import collection.JavaConversions._
. Khi cần thiết, trình biên dịch sẽ tự động chuyển đổi bộ sưu tập java thành loại scala phù hợp.
JavaConverters
là một bộ trang trí giúp chuyển đổi các bộ sưu tập java hoặc scala thành các bộ sưu tập scala hoặc java bằng cách sử dụng asScala
hoặc asJava
các phương thức sẽ được thêm vào bộ sưu tập mà bạn muốn chuyển đổi. Để sử dụng các bộ chuyển đổi này, bạn cần nhập:
import collection.JavaConverters._
Bạn nên thích JavaConversions
vì nó thường dễ sử dụng hơn (không cần sử dụng asScala
hoặc asJava
).