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 对象
Java和Scala容器转换的更多相关文章
- 3.scala容器
3.scala容器 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-o ...
- (转)Java中的容器详细总结
Java中的容器详细总结(编辑中) 原文链接:http://anxpp.com/index.php/archives/656/ 注:本文基于 Jdk1.8 编写 通常程序总是根据运行时才知道的某些条件 ...
- Java页面中文编码要转换两次encodeURI
1.js文件中使用encodeURI()方法. login_name = encodeURI(encodeURI(login_name)); 2.action中URLDecoder解码 loginNa ...
- Java多线程-并发容器
Java多线程-并发容器 在Java1.5之后,通过几个并发容器类来改进同步容器类,同步容器类是通过将容器的状态串行访问,从而实现它们的线程安全的,这样做会消弱了并发性,当多个线程并发的竞争容器锁的时 ...
- gradle项目中如何支持java与scala混合使用?
之前写过一篇maven项目中java与scala如何混用,今天来看看gradle项目中如何达到同样的效果: 一.目录结构 基本上跟maven一样,tips:这一堆目录结构不用死记,后面会讲如何用gra ...
- Java 二进制与十六进制转换
Java 二进制与十六进制转换 二进制转换十六进制 /** * @description 将二进制转换成16进制 * * @param buf * @return */ public static S ...
- 转:java多线程--同步容器
java同步容器 在Java的集合容器框架中,主要有四大类别:List.Set.Queue.Map.List.Set.Queue接口分别继承了Collection接口,Map本身是一个接口.注意Col ...
- java中汉字自动转换成拼音
java中汉字自动转换成拼音 1.需要下载jar包 pinyin4j.2.5.0.jar ,加入到WEB-INF下的lib里边,右键add to bulid path. 2.[代码]PinYinUti ...
- java中的容器问题
小小的总结一下java中的容器问题. 一.三个知识点 1.迭代器 1).java.util.Interator + hasnext(); next(); remove(); 2).java.lang. ...
随机推荐
- 栈的压入、弹出序列(剑指offer-21)
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...
- vue+element-ui JYAdmin后台管理系统模板-集成方案【项目搭建篇2】
项目搭建时间:2020-06-29 本章节:讲述基于vue/cli, 项目的基础搭建. 本主题讲述了: 1.跨域配置 2.axios请求封装 3.eslint配置 4.环境dev,test,pro(开 ...
- 电商项目app开发
购物app的开发 首先我们本次要写的是一个电商的项目,项目主要功能有登录.注册.商品展示.轮播图.加入购物车.购物车管理.支付管理.地址管理.个人信息的修改.商品的分类展示.微信支付等等.主要使用vu ...
- python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super
https://www.cnblogs.com/liubing8/p/11321099.html 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 ...
- HotSpot VM运行时
HotSpot VM运行时系统为HotSpot JIT编译器和垃圾收集器提供服务和通用API,同时还为VM提供启动.线程管理.JNI(Java本地接口)等基本功能.HotSpot VM运行时环境担当许 ...
- 大牛聊Java并发编程原理之 线程的互斥与协作机制
可能在synchronized关键字的实现原理中,你已经知道了它的底层是使用Monitor的相关指令来实现的,但是还不清楚Monitor的具体细节.本文将让你彻底Monitor的底层实现原理. 管程 ...
- Kubernetes容器化工具Kind实践部署Kubernetes v1.18.x 版本, 发布WordPress和MySQL
Kind 介绍 Kind是Kubernetes In Docker的缩写,顾名思义是使用Docker容器作为Node并将Kubernetes部署至其中的一个工具.官方文档中也把Kind作为一种本地集群 ...
- P5836 [USACO19DEC]Milk Visits S 从并查集到LCA(最近公共祖先) Tarjan算法 (初级)
为什么以它为例,因为这个最水,LCA唯一黄题. 首先做两道并查集的练习(估计已经忘光了).简单来说并查集就是认爸爸找爸爸的算法.先根据线索理认爸爸,然后查询阶段如果发现他们的爸爸相同,那就是联通一家的 ...
- Mybatis——Mapper代理
mapper的代理对象生成位于org.apache.ibatis.binding.MapperProxyFactory的newInstance方法,使用jdk的动态代理,代理的InvocationHa ...
- django-rest-framework-源码解析004-三大验证(认证/权限/限流)
三大验证模块概述 在DRF的APIView重写的dispatch方法中, self.initial(request, *args, **kwargs) 这句话就是执行三大验证的逻辑, 点进去可以看到 ...