关键词搜索

源码搜索 ×
×

Scala与Java集合互转摘要

发布2018-04-23浏览2725次

详情内容


欢迎支持笔者新作:《深入理解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支持的互转类型(内容来源于源码注释)。

  1. 以下可以通过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
    1. 以下可以通过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
    1. 以下可以通过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
    1. 以下可以通过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实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


      相关技术文章

      点击QQ咨询
      开通会员
      返回顶部
      ×
      微信扫码支付
      微信扫码支付
      确定支付下载
      请使用微信描二维码支付
      ×

      提示信息

      ×

      选择支付方式

      • 微信支付
      • 支付宝付款
      确定支付下载