Sự khác biệt giữa JavaConverters và JavaConversions trong Scala là gì?


Câu trả lời:


253

EDIT: Java Conversions@deprecatedtrong Scala 2.13.0. Thay vào đó, hãy sử dụng scala.jdk.CollectionConverters .

JavaConversionscung 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.

JavaConverterssử dụng mô hình thư viện pimp-my-library để bổ sung asScalaphương thức vào các bộ sưu tập Java và asJavaphươ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 JavaConvertersvì 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 .asScalahoặc .asJava.

Đây là phương thức chuyển đổi JavaConverterscung 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ừ JavaConversionstrự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

5
Có, sử dụng JavaConverters trên JavaConversions ,. Nhưng cũng nên xem xét sử dụng github.com/scalaj/scalaj-collection vì nó có một số lợi ích khi chuyển đổi java.util.List sang Seq. (Có phải danh sách trên từ 2.8.1 không?)
oluies

7
@David Mặc dù các chuyển đổi ngầm định như các chuyển đổi được cung cấp JavaConversionsthuậ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.
Jean-Philippe Pellet

1
@ Jean-PhilippePellet chuyển đổi ngầm định trong Scala là Phạm vi dựa trên vì vậy nếu bạn khô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.
David

2
@David, và với JavaConvertersbạ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.
Jean-Philippe Pellet

23
Bạn sẽ nghĩ việc đặt tên sẽ tốt hơn: ví dụ như "JavaConversionsImplicit" và "JavaConversionsExplicit" sẽ dễ phân biệt hơn.
Raman

52

Đối với bất kỳ ai tiếp cận câu hỏi này kể từ Scala 2.12.x, JavaConversionshiện không được chấp nhận và JavaConverterslà phương pháp được ưa thích.


2
Vì Scala 2.13, JavaConverterskhông được dùng nữa và scala.jdk.CollectionConverterslà phương pháp được ưa thích;)
antonone

4

Trong Scala 2.13, JavaConvertersđã không được ủng hộ scala.jdk.CollectionConverters:

... gói mới scala.jdkvới các đối tượng CollectionConverters (cổ điển bộ sưu tập Java, tương tự như collection.JavaConverterstrong 2.12), StreamConverters, FunctionConvertersOptionConverters...


3

Như đã giải thích trong API, JavaConversionslà 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.

JavaConverterslà 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 asScalahoặc asJavacá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 JavaConversionsvì nó thường dễ sử dụng hơn (không cần sử dụng asScalahoặc asJava).


15
Mặc dù sử dụng cách tiếp cận hoàn toàn ngầm định của JavaConverters dễ viết hơn, nhưng lại khó đọc hơn. Kiểu Scala hiện tại cho thấy rằng tốt hơn là gọi các phương thức để thực hiện chuyển đổi, đó là lý do tại sao JavaConverters hiện được ưa thích hơn.
Leif Wickland

JavaConversions không được dùng nữa trong Scala 2.12
Andrzej Wsowski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.