参考: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 对象

Java和Scala容器转换的更多相关文章

  1. 3.scala容器

    3.scala容器 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-o ...

  2. (转)Java中的容器详细总结

    Java中的容器详细总结(编辑中) 原文链接:http://anxpp.com/index.php/archives/656/ 注:本文基于 Jdk1.8 编写 通常程序总是根据运行时才知道的某些条件 ...

  3. Java页面中文编码要转换两次encodeURI

    1.js文件中使用encodeURI()方法. login_name = encodeURI(encodeURI(login_name)); 2.action中URLDecoder解码 loginNa ...

  4. Java多线程-并发容器

    Java多线程-并发容器 在Java1.5之后,通过几个并发容器类来改进同步容器类,同步容器类是通过将容器的状态串行访问,从而实现它们的线程安全的,这样做会消弱了并发性,当多个线程并发的竞争容器锁的时 ...

  5. gradle项目中如何支持java与scala混合使用?

    之前写过一篇maven项目中java与scala如何混用,今天来看看gradle项目中如何达到同样的效果: 一.目录结构 基本上跟maven一样,tips:这一堆目录结构不用死记,后面会讲如何用gra ...

  6. Java 二进制与十六进制转换

    Java 二进制与十六进制转换 二进制转换十六进制 /** * @description 将二进制转换成16进制 * * @param buf * @return */ public static S ...

  7. 转:java多线程--同步容器

    java同步容器 在Java的集合容器框架中,主要有四大类别:List.Set.Queue.Map.List.Set.Queue接口分别继承了Collection接口,Map本身是一个接口.注意Col ...

  8. java中汉字自动转换成拼音

    java中汉字自动转换成拼音 1.需要下载jar包 pinyin4j.2.5.0.jar ,加入到WEB-INF下的lib里边,右键add to bulid path. 2.[代码]PinYinUti ...

  9. java中的容器问题

    小小的总结一下java中的容器问题. 一.三个知识点 1.迭代器 1).java.util.Interator + hasnext(); next(); remove(); 2).java.lang. ...

随机推荐

  1. 小书MybatisPlus第2篇-条件构造器的应用及总结

    一.条件构造器Wrapper Mybatis Plus为我们提供了如下的一些条件构造器,我们可以利用它们实现查询条件.删除条件.更新条件的构造. 条件构造器用于给如下的Mapper方法传参,通常情况下 ...

  2. SpringBoot集成MyBatis小记

    SpringBoot集成MyBatis小记 参考MyBatis官网 1. 添加maven依赖 添加到pom.xml <dependency> <groupId>org.myba ...

  3. drf路由与认证

    目录 一.路由 1 没有继承视图集的视图类 2 继承了视图集的视图类 3 继承自ModelViewSet的路由写法(自动生成) 二.认证 1 drf认证的源码分析 2 自定义认证类的使用 一.路由 三 ...

  4. day04 python入门(变量,基本数据类型)

    python入门学习 来自egon的学习套路 在每次遇到一个新事物的时候,要学三步: xxx是什么? 为什么要有xxx? ​ 大前提:python中所有出现的语法都是为了让计算机能够具有人的某一个功能 ...

  5. 《Object Storage on CRAQ: High-throughput chain replication for read-mostly workloads》论文总结

    CRAQ 论文总结 说明:本文为论文 <Object Storage on CRAQ: High-throughput chain replication for read-mostly wor ...

  6. python 装饰器(二):装饰器基础(二)变量作用域规则,闭包,nonlocal声明

    变量作用域规则 在示例 7-4 中,我们定义并测试了一个函数,它读取两个变量的值:一个是局部变量 a,是函数的参数:另一个是变量 b,这个函数没有定义它. >>> def f1(a) ...

  7. bzoj3620似乎在梦中见过的样子

    bzoj3620似乎在梦中见过的样子 题意: 给出一个字符串,要求求出形如A+B+A的子串数量,且lenA≥k,lenB≥1.字符串长度≤15000,k≤100,所以字符长度为小写字母. 题解: 第一 ...

  8. jdk安装无反应解决方法

    找到该文件(隐藏文件),如果里面是只有空格,清空后重新安装就可以.若有内容设置INSTALL_SILENT=0 后重新安装.

  9. 30页软件测试人面试宝典文档资料,助你拿下了百度、美团、字节跳动、小米等大厂的offer【内含答案】

    前言:看了一下桌边的日历,新的6月,已经过去5天了.明天又是周六了,大家准备怎么度过呢?趁着大家周末给大家分享一个软件测试工程师面试题汇总. 拿到大厂的offer一直是软件测试朋友的一个目标,我是如何 ...

  10. Android调用摄像机拍照(只能拍一张,第二张自动替换)

    这两天我玩了玩几天没动的Android,脑子里冒出一个注意,想用Android调用摄像机(偷拍)拍照,然后存下来,在网上百度一下就有很多人说,我也试了试,7.0以下非常轻松就成功了,因为7.0一下不用 ...