摘要:Scala,Java,JavaConverters
包括三种场景的转化
Java脚本中,将Scala集合转化为Java集合
Scala脚本中,将Scala集合转化为Java集合
Scala脚本中,将Java集合转化为Scala集合
JavaConverters隐式转换
Scala提供了大量的方法来隐式转换所有主要的Java和Scala容器类型。其中提供了如下的双向类型转换
Iterator<=>java.util.Iterator
Iterator<=>java.util.Enumeration
Iterable<=>java.lang.Iterable
Iterable<=>java.util.Collection
mutable.Buffer<=>java.util.List
mutable.Set<=>java.util.Set
mutable.Map<=>java.util.Map
mutable.ConcurrentMap<=>java.util.concurrent.ConcurrentMap
使用这些转换很简单,只需从JavaConverters对象中import它们即可。import之后,通过扩展方法 asScala 和 asJava 就可以在Scala容器和与之对应的Java容器之间进行隐式转换了
scala> import collection.JavaConverters.import collection.JavaConverters.
还有一些Scala容器类型可以转换成对应的Java类型,但是并没有将相应的Java类型转换成Scala类型的能力,它们是:
Seq=>java.util.List
mutable.Seq=>java.util.List
Set=>java.util.Set
Map=>java.util.Map
因为Java并未区分可变容器不可变容器类型,所以,虽然能将scala.immutable.List转换成java.util.List,但所有的修改操作都会抛出“UnsupportedOperationException”
scala>val jul=List(1,2,3).asJavajul:java.util.List[Int]=[1,2,3]scala>jul.add(7)java.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(AbstractList.java:148)
在Java中调用使用Scala集合
Scala List => Java List
在Scala中定义方法返回List,在Java中调用得到返回值并转化为Java的list。
objectReturnScalaCollection{defreturnList():List[String]={returnList(“a”,“b”,“c”)}defreturnListType():List[Int]={returnList(1,2,3)}}
Scala list调用apply方法获得下标元素,循环一遍得到Java list,如果不是String对象,Java中得到的返回值泛型是Object,通过类型强转得到对应类型
publicstaticvoidmain(String[]args){scala.collection.immutable.Listres=ReturnScalaCollection.returnList();Listlist=newArrayList<>();for(int i=0;i<res.size();i++){list.add(res.apply(i));}System.out.println(list);// [a, b, c]scala.collection.immutable.Listres2=ReturnScalaCollection.returnListType();Listlist2=newArrayList<>();for(int i=0;i<res2.size();i++){list2.add((int)res2.apply(i));}System.out.println(list2);// [1, 2, 3]}
Scala Map => Java Map
Scala转List<Tuple2<>>,使用下标访问填充到Java Map。
defreturnMap():Map[String,Int]={returnMap(“a”->1,“b”->2)}
publicstaticvoidmain(String[]args){scala.collection.immutable.Map<String,Object>res3=ReturnScalaCollection.returnMap();// scala.collection.immutable.List<Tuple2<String, Object>> res3List = res3.toList();Map<String,Integer>map=newHashMap<>();for(int i=0;i<res3.size();i++){map.put(res3.toList().apply(i)._1(),(int)res3.toList().apply(i)._2());// {a=1, b=2}}System.out.println(map);}
Scala Set => Java Set