欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。
欢迎跳转到本文的原文链接:https://honeypps.com/java/scala-and-java-collection-exchanges/
在上一篇文章《再看Kafka Lag》中笔者提及了Scala与Java集合互转的内容,但是并未有详述,本文对此做一个补充说明,方便在使用的时候可以随时翻阅。
对于集合而言,Scala从2.8.1开始引入scala.collection.JavaConverters用于Scala与Java集合的互转。在scala代码中如果需要集合转换,首先引入scala.collection.JavaConverters._,进而显示调用asJava或者asScala方法完成转型。与此雷同的scala.collection.JavaConversions已被标注为@Deprecated(since 2.12.0),JavaConversions可以做到隐式转换,即不需要asJava或者asScala的调用,但是这样可能会对阅读造成障碍,可能会让人难以知晓什么变成了什么。笔者这里罗列出JavaConverters支持的互转类型(内容来源于源码注释)。
- 以下可以通过asScala和asJava进行互转:
* scala.collection.Iterable <=> java.lang.Iterable
* scala.collection.Iterator <=> java.util.Iterator
* scala.collection.mutable.Buffer <=> java.util.List
* scala.collection.mutable.Set <=> java.util.Set
* scala.collection.mutable.Map <=> java.util.Map
* scala.collection.concurrent.Map <=> java.util.concurrent.ConcurrentMap
- 以下可以通过asScala将Java的转成Scala的,通过特殊的命名(如asJavaCollection)将Scala的转成Java的:
* scala.collection.Iterable <=> java.util.Collection (via asJavaCollection)
* scala.collection.Iterator <=> java.util.Enumeration (via asJavaEnumeration)
* scala.collection.mutable.Map <=> java.util.Dictionary (via asJavaDictionary)
- 1
- 2
- 3
- 以下可以通过asJava进行Scala到Java的单向转换:
* 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
- 1
- 2
- 3
- 4
- 以下可以通过asScala进行Java到Scala的单向转换:
* java.util.Properties => scala.collection.mutable.Map
- 1
在所有情形下,从原始类型转变到对侧类型之后再转变回来的话会是同一个对象,举例
import scala.collection.JavaConverters._
val source = new scala.collection.mutable.ListBuffer[Int]
val target: java.util.List[Int] = source.asJava
val other: scala.collection.mutable.Buffer[Int] = target.asScala
assert(source eq other)
另外,转换方法也有其描述性的名称可供显示调用,举例如下:
scala> val vs = java.util.Arrays.asList("hi", "bye")
vs: java.util.List[String] = [hi, bye]
scala> val ss = asScalaIterator(vs.iterator)
ss: Iterator[String] = non-empty iterator
scala> .toList
res0: List[String] = List(hi, bye)
scala> val ss = asScalaBuffer(vs)
ss: scala.collection.mutable.Buffer[String] = Buffer(hi, bye)
- 7
- 8
- 9
- 10
- 11
欢迎跳转到本文的原文链接:https://honeypps.com/java/scala-and-java-collection-exchanges/
欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。