scala與java之間的集合型別轉換
阿新 • • 發佈:2019-01-07
近期在開發Java,Scala混合系統,因為java,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.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 集合物件===>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 物件