Scala中[+:][:+][++][::][:::]的区别

改进:

使用块引用,增强可读性

提示:

问题->方法->问题->
今天简单介绍下Scala元素或者集合的联合操作:

 

[1] Scala中的++运算符,代码如下:

/**
  * ++
  * 该方法用于连接两个集合list1++list2
  */
def TestDoublePlus(): List[Int] = {
  val l1 = List(1, 2, 3)
  val l2 = List(4, 5, 6)
  l1 ++ l2
}

 

运行结果如下: 

List(1, 2, 3, 4, 5, 6)

相信大家和我一样有一个疑问,如果不同类型使用++会如何呢? 

  def TestDoublePlus(): List[Int] = {
    val l1 = List(1, 2, 3)
    val l2 = List(4, 5, 6)
    val l3=List("4","5","6")
    l1 ++ l3
  }

我们假想下,如果不同类型的集合可以++操作,运行结果如下:

List(1,2,3,"4","5","6")

 实际运行结果如下: 

Error:(13, 11) type mismatch;
 found   : List[String]
 required: scala.collection.IterableOnce[Int]
    l1 ++ l3

从打印的异常信息可以看出元素迭代时类型不匹配,但如果不打印刚才的代码可以正常运行吗?

注释打印代码后,重新运行,结果如下:

Error:(13, 11) type mismatch;
 found   : List[String]
 required: scala.collection.IterableOnce[Int]
    l1 ++ l3 

我们可能有一个疑惑,代码编辑器没有提示代码错误?这时可能想到参数返回类型是不是不匹配?修改代码,如下: 

def TestPlusColon(): List[Any] = {
  val l1 = List(1, 2, 3)
  val l2 = List(4, 5, 6)
  l1 +: l2
}
运行结果如下:

List(1, 2, 3, 4, 5, 6) 
至此我们至少从结果中看出以下几个问题:

[1] scala ++操作衍生出新的对象

[2] ++操作可以操作不同类型集合

[3] ++操作并非元素追加,如List(1,2,3,List["4","5","6"]) 

集合和集合可以++操作,元素和集合是否也可以呢? 代码如下:

def TestDoublePlus(): List[Any] = {
  val l1 = List(1, 2, 3)
  val l2 = List(4, 5, 6)
  val l3=List("4","5","6")
  val l4=4
  l1 ++ l4
}
当我们如此操作之后,编译器直接提示异常,提示l4为Int类型,至此问题得到结论:

++操作,不能够追加非集合元素,至于原因我们简单想下也很清楚.Int类型元素不可以迭代

 

那么我们至少要印证下,我们的猜测,最简单直接的方式是看下源码: 

  @`inline` final def ++ [B >: A](suffix: IterableOnce[B]): CC[B] = concat(suffix)
 从源码看,++操作后缀元素,必须为可迭代对象 [B >: A]限定了B为A的超类
下面介绍下其他运算符的使用,上面的分析思路,可以沿用到下面的几种操作运算符,不作详细介绍

 [2] Scala中的+:运算符,代码如下:

 /**
    * +:方法用于在头部追加元素
    */
  def TestPlusColon(): List[Any] = {
    val l1 = List(1, 2, 3)
    val l2 = List(4, 5, 6)
    l1 +: l2
  }
运行结果如下:

List(List(1, 2, 3), 4, 5, 6) 

[3] Scala中的:+运算符,代码如下:

/**
    * :+方法用于在尾部追加元素
    */
  def TestColonPlus(): List[Any] = {
    val l1 = List(1, 2, 3)
    val l2 = List(4, 5, 6)
    val l3 = List("4", "5", "6")
    l1 :+ l2
  }
运行结果如下:

List(1, 2, 3, List(4, 5, 6))

[4] Scala中的::运算符,代码如下:

/**
    * ::和+:类似
    * 但是::可以用于pattern match ,而+:则不行
    *
    */
  def TestDoubleColon(): List[Any] = {
    val l1 = List(1, 2, 3)
    val l2 = List(4, 5, 6)
    val l3 = List("4", "5", "6")
    l1 :: l2
  }
 运行结果如下:

List(List(1, 2, 3), 4, 5, 6) 

 

[5] Scala中的:::运算符,代码如下:

 /**
    * :::
    * 该方法只能用于连接两个List类型的集合
    */
  def TestTriColon(): List[Any] = {
    val l1 = List(1, 2, 3)
    val l2 = List("4", "5", "6")
    l1 :: l2
  }
  运行结果如下:

List(List(1, 2, 3), 4, 5, 6)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值