改进:
使用块引用,增强可读性
提示:
问题->方法->问题->
今天简单介绍下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)