最近新入职公司,所在项目组使用hadoop较多,基本都在使用spark做计算,为了更好的操作spark最近也在学习scala这门语言(原因:spark源码是scala)。
新遇问题:众所周知,java 和scala是可以相互调用的,在调用的时候,集合类的相互转化会有问题。也就是说,java的List和scala的List是不一样的,解决后以此记录。
以下为官方可直接转换列表(单向 =>, 双向<=>):
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.mutable.ConcurrentMap <=> java.util.concurrent.ConcurrentMap
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.collection.JavaConverters 这个工具类包含了基本的转换情景
话不多说上代码:
· Scala代码:
/**
* Map 互相转换
**/
def convert2JavaMap(scalaMap: Map[String, String]): Unit = {
//scala Map ==> java Map
val javaMap: util.Map[String, String] = scalaMap.asJava
//java Map ==> scala Map
import scala.collection.JavaConversions.mapAsScalaMap
val scalaMap1: scala.collection.mutable.Map[String, String] = javaMap
}
/**
* List 互相转换
**/
def convert2JavaList(scalaList: List[String]): Unit = {
//java List ==> scala List
val javaList: java.util.List[String] = scalaList.asJava
//scala List ==> java List
val buffer: scala.collection.mutable.Buffer[String] = javaList.asScala
val list: List[String] = buffer.toList
}
/**
* 略微复杂的结构
**/
def convert2JavaMaps(scalaMapList: List[Map[String, String]]): java.util.List[java.util.Map[String, String]] = {
val arrayBuffer = ArrayBuffer[util.Map[String, String]]()
val javaList: util.List[Map[String, String]] = scalaMapList.asJava
for (i <- 0 until javaList.size()) {
val javaMap: util.Map[String, String] = javaList.get(i).asJava
arrayBuffer += javaMap
}
val javaMapList: util.List[util.Map[String, String]] = arrayBuffer.toArray.toList.asJava
javaMapList
}
· Java代码:
/**
* List 互相转换
**/
public static void convert2List(scala.collection.immutable.List<String> scalaList){
//scala List ==> java List
List<String> javaList = JavaConversions.seqAsJavaList(scalaList);
//java List ==> scala List
scalaList = JavaConversions.asScalaIterator(javaList.iterator()).toSeq().toList();
}
/**
* Map 互相转换
**/
public static void convert2Map(scala.collection.Map<String, String> scalaMap){
//scala Map ==> java Map
Map<String, String> javaMap = JavaConversions.mapAsJavaMap(scalaMap);
//java List ==> scala List
scalaMap= JavaConversions.mapAsScalaMap(javaMap);
}
如何选择这几种方法,取决于在哪边抽象成工具,统一处理。
初学者总结,如有不当请指教。