Java和Scala容器轉換


參考:https://blog.csdn.net/dymkkj/article/details/77921573

Java和Scala互操作的一個重要的內容就是容器的轉換,容器是一個語言的數據結構,表現了一個語言除了語法之外的第二重要氣質。所以了解Scala的容器尤為重要。

scala--java集合類型轉換

一  、 scala  <==> java 
  

  以下集合可以進行任意,轉換。但在某些情況下引入的隱式轉換不正確或未引入,仍然無法進行正確轉換,如API的例子

scala.collection.Iterable <=> java.lang.Iterable
scala.collection.Iterable <=> java.util.Collection
scala.collection.Iterator <=> java.util.{ Iterator, Enumeration }
scala.collection.mutable.Buffer <=> java.util.List
scala.collection.mutable.Set <=> java.util.Set
scala.collection.mutable.Map <=> java.util.{ Map, Dictionary }
scala.collection.concurrent.Map <=> java.util.concurrent.ConcurrentMap


總結下來就是:collection:可以指定元素排序規則:sort方法或繼承comparable
scala.collection.Iterable<=>java.lang.{iterable,collection}
scala.collection.Iterator<=>java.util.{Iterator,Enumeration}

 


scala的Buffer對應就是java.util.List,不可直接使用,使用ListBuffer
scala.collection.mutable.Buffer<=>java.util.List
scala.collection.mutable.Set<=>java.util.Set
scala.collection.mutable.Map<=>java.util.{Map,Dictionary}


二、並發安全集合


  scala.collection.concurrent.Map<=>java.util.concurrent.ConcurrentMap

 

三、例子

以下為scala.collection.mutable.ListBuffer<=>java.util.List
除要求引入相應的轉換類JavaConversions._,還有引入ListBuffer=>java.util.List 具體轉換方法

import scala.collection.JavaConversions._
import scala.collection.JavaConversions.bufferAsJavaList
import scala.collection.JavaConversions.asScalaBuffer


object Imliplicit{
          def main(args: Array[String]): Unit = {
              val sl = new  scala.collection.mutable.ListBuffer[Int] 
              val jl : java.util.List[Int] = sl
              val sl2 : scala.collection.mutable.Buffer[Int] = jl
        
              println("兩者集合是否相等:   "+(sl eq sl2))
          } 
}

四、 單向轉換


scala.collection.Seq =>java.util.List
scala.collection.mutable.Seq => java.util.List
scala.collection.Set =>java.util.Set
scala.collection.Map =>java.util.Map


操作參數/屬性配置文件的類
java.util.Properties => scala.collection.mutable.Map[String,String]

 

五、轉換方法

眾所周知,Scala的類型轉換建立在隱式轉換的基礎上,而隱式轉換則建立在隱式轉換方法的基礎之上。所以要想使用隱式類型轉換,需要顯式地引入下面的隱式轉換方法。

Scala 集合對象===>Java 集合對象
如果在進行java集合對象與scala集合對象的轉換時,引入import scala.collection.JavaConversions._后仍然無法轉換,
則嘗試引入你要轉換的集合類型對應的具體隱式轉換方法,方法如下:

 

implicit def  asJavaCollection[A](it:iterable[A]):collection[A]
     隱式轉換一個scala iterable 為  一個不可變的java.collection


implicit def  asJavaDictionary[A,B](m:mutable.Map[A,B]):Dictionary[A,B]
     隱式轉換一個scala iterable 為一個java  Dictionary


implicit def  asJavaEnumeration[A](it:Iterator[A]):java.util.Enumeration
     隱式轉換一個scala iterable 為一個java Enumeration
 
implicit def  asJavaIterable[A](i:iterable[A]):java.lang.Iterable[A]
     隱式轉換一個scala iterable 為一個java Iterable
 
implicit def  asJavaIterator[A](it:Iterator[A]):java.lang.Iterator
     隱式轉換一個scala iterator 為一個java iterator
 
implicit def  bufferAsJavaList[A](s:java.util.Set[A]):java.util.list
     隱式一個scalaBuffer(用其實現Buffer接口,AbstractBuffer抽象類的子類作為接受對象)為java.util.list
 
implicit def  mapAsJavaConcurrentMap[A,B](m:concurrent.Map[A,B]):ConcurrentMap[A,B]
     隱式轉換一個Scala.mutable.concurrent.Map 轉換為 java.concurrent.ConcurrentMap 
 
implicit def  mapAsJavaMap[A,B](m:Map[A,B]):java.util.Map[A,B]
     隱式轉換一個scala.Map 轉換為java map對象
 
implicit def  mutableMapAsJavaMap[A,B](m:mutable.Map[A,B]):java.util.Map[A,B]
     隱式轉換一個 scala.mutable.Map轉換為一個 java.util.Map對象
 
implicit def  mutableSeqAsJavaList[A,B](m:mutable.Seq[A,B]):java.util.List[A,B]
     隱式轉換一個 scala.mutable.Seq 轉換為一個 java.util.List對象


implicit def  mutableSetAsJavaSet[A,B](m:mutable.Set[A,B]):java.util.Set[A,B]
     隱式將一個 scala.mutable.Seq 轉換為一個 java.util.Set對象

Java 集合對象 ==> Scala集合對象


implicit def  asScalaBuffer[A](l:java.util.List[A]):Buffer[A]
     隱式轉換一個java.util.list對象為scalaBuffer(用其實現Buffer接口,AbstractBuffer抽象類的子類作為接受對象)
 
implicit def  asScalaIterator[A](it:java.util.Iterator[A]):Iterator[A]
     隱式轉換一個java.util.iterator對象為scala.iterator
 
implicit def  asScalaSet[A](s:java.util.Set[A]):mutable.Set 
     隱式轉換一個java.util.Set 為mutable.Set


implicit def  collectionAsScalaIterable[A](i:Collection[A]):Iterable[A]
     隱式轉換一個java.collection對象為scala.iterable
 
implicit def  dictionaryAsScalaMap[A,B](p:Dictionary[A,B]):mutable.Map[A,B]
     隱式轉換一個java.Dictionary 對象轉換為Scala.mutable.Map[String,String]
 
implicit def  enumerationAsScalaIterator[A](i:java.lang.Enumeration[A]):Iterator[A]
     隱式將一個java.Enumeration 對象轉換為Scala.iterator對象
 
implicit def  iterableAsScalaIterable[A](i:java.lang.Iterable[A]):Iterable[A]
     隱式將一個java.Iterable對象轉換為Scala.iterable對象

implicit def  mapAsScalaConcurrentMap[A,B](m:ConcurrentMap[A,B]):concurrent.Map[A,B]
     隱式將一個java concurrentMap 轉換為一個scala.concurrentMap對象
 
implicit def  mapAsScalaMap[A,B](m:java.util.Map[A,B]):mutable.Map[A,B]
     隱式將一個java.util.Map 轉換為一個scala.Map 對象
 
implicit def  propertiesAsScalaMap(p:Properties):mutable.Map[String,String]
     隱式將一個 java Properties 轉換為一個 mutable.Map對象
 
implicit def  seqAsJavaList[A](seq:Seq[A]):java.util.List[A]
     隱式將一個scala.Seq  轉換為一個 java.util.List 對象


implicit def  setAsJavaSet[A](set:Set[A]):java.util.Set[A]
     隱式將一個scala.Set  轉換為一個 java.util.Set 對象  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM