30

Tôi có một bản đồ java: java.util.Map<SomeObject, java.util.Collection<OtherObject>> và tôi muốn chuyển nó sang bản đồ scala: Map[SomeObject, Set[OtherObject]]Chuyển đổi Java Map để Scala Bản đồ

Tôi đã sử dụng mapAsScalaMap nhưng kết quả không phải là khá những gì tôi muốn, kết quả là: Map[SomeObject, java.util.Collection[OtherObject]]. Làm thế nào tôi có thể sửa nó để chuyển đổi bộ sưu tập thành một bộ?

LƯU Ý: thực sự vấn đề ban đầu của tôi là chuyển đổi số ArrayListMultimap<SomeObject, OtherObject> của google thành số MultiMap[SomeObject, OtherObject] nhưng vì điều này là không thể tôi đã chia ra vấn đề. Nếu bạn có một giải pháp cho vấn đề ban đầu, tôi cũng sẽ chấp nhận nó như là câu trả lời.

+0

nhìn vào bài đăng này: http://stackoverflow.com/questions/3127238/convert-java-util-mapstring-object-to-scala- collection-immutable-mapstring –

+0

và trang này: http://www.scala-lang.org/docu/files/collections-api/collections_46.html –

+0

@LutherBlisset: Nó có cùng kết quả như mapAsScalaMap: Map [SomeObject, java .util.Collection [OtherObject]] – Ha11owed

Trả lời

41

Sửa: cách khuyến cáo hiện nay là sử dụng JavaConverters.asScala phương pháp:

import scala.collection.JavaConverters._ 
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala.toSet) 

này có lợi thế là không sử dụng chuyển đổi tiềm ẩn huyền diệu nhưng các cuộc gọi rõ ràng để .asScala, trong khi ở sạch sẽ và consise.


Câu trả lời ban đầu với JavaConversions:

Bạn có thể sử dụng scala.collection.JavaConversions để ngầm chuyển đổi giữa Java và Scala:

import scala.collection.JavaConversions._ 
val myScalaMap = myJavaMap.mapValues(_.toSet) 

Calling mapValues sẽ kích hoạt một chuyển đổi ngầm từ java Map để một scala Map và sau đó gọi toSet trên bộ sưu tập java với ngầm chuyển đổi nó thành một bộ sưu tập scala và sau đó đến một Set.

Theo mặc định, nó trả về một biến thể Map, bạn có thể nhận được một biến đổi bất biến với số .toMap bổ sung.

ngắn ish dụ:

scala> val a: java.util.Map[String, java.util.Collection[String]] = new java.util.HashMap[String, java.util.Collection[String]] 
a: java.util.Map[String,java.util.Collection[String]] = {} 

scala> val b = new java.util.ArrayList[String] 
b: java.util.ArrayList[String] = [] 

scala> b.add("hi") 
res5: Boolean = true 

scala> a.put("a", b) 
res6: java.util.Collection[String] = [] 

scala> import scala.collection.JavaConversions._ 
import scala.collection.JavaConversions._ 

scala> val c = a.mapValues(_.toSet) 
c: scala.collection.Map[String,scala.collection.immutable.Set[String]] = Map(a -> Set(hi)) 

scala> c.toMap 
res7: scala.collection.immutable.Map[String,scala.collection.immutable.Set[String]] = Map(a -> Set(hi)) 
+0

Cảm ơn bạn, tôi đã bỏ lỡ phần "mapValues ​​(_. ToSet)" – Ha11owed

+2

@ Ha11owed Mọi người khuyên bạn nên chuyển đổi: http://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and- javaconversions-in-scala và nhận xét cho http://docs.scala-lang.org/overviews/collections/conversions-between-java-and-scala-collections.html –

0

Bạn có thể chuyển đổi các Map Java vào Scala Bản đồ sử dụng chức năng dưới đây:

val scalaMap = javaMap.asScala; 

Để sử dụng này, bạn cần phải nhập khẩu các scala.collection nhập khẩu. Thư viện JavaConverters._.

Hy vọng điều này sẽ hữu ích.

0

Immutable Bản đồ myJavaMap.asScala.toMap

Biên Đổi đồ myJavaMap.asScala