1、数组
Scala数组与Scala序列是兼容的 - 在需要Seq[T]的地方可由Array[T]代替。最后,Scala数组支持所有的序列操作。
隐式转换
方法1:通过scala.collection.mutable.WrappedArray将数组转换成序列
/* ---示例代码----*/

scala> val va=Array(1,2,3)
va: Array[Int] = Array(1, 2, 3)
scala> val seq1:Seq[Int] = va
seq1: Seq[Int] = WrappedArray(1, 2, 3) /* ---示例代码----*/
方法2:通过scala.collection.mutable.ArrayOps类将数组添加到ArrayOps对象中,ArrayOps支持序列的所有方法
/* ---示例代码----*/

scala> val va=Array(1,2,3)
va: Array[Int] = Array(1, 2, 3)
scala> va.reverse
res2: Array[Int] = Array(3, 2, 1) /* ---示例代码----*/
方法2实现原理
数据在调用序列方法时会做隐式转换,通过调用implicit def genericArrayOps[T](xs: Array[T]): ArrayOps[T]方法,将数据添加到ArrayOps对象中
/* ---示例代码----*/

scala> val va=Array(1,2,3)
va: Array[Int] = Array(1, 2, 3)
scala> intArrayOps(va)
res3: scala.collection.mutable.ArrayOps[Int] = [I(1, 2, 3)
scala> res3.reverse
res5: Array[Int] = Array(3, 2, 1) scala> val ops:collection.mutable.ArrayOps[Int] = va
ops: scala.collection.mutable.ArrayOps[Int] = [I(1, 2, 3)
scala> ops.reverse
res0: Array[Int] = Array(3, 2, 1) /* ---示例代码----*/
数组泛型
没看懂
 
2、字符串
字符串不是直接序列,但可以转换成序列,与数据的转换方式类似,只是类型分别为WrappedString和scala.collection.immmutable.StringOps 
 
3、容器的等价性
a、不同范畴的容器总是不能相等,即使有相同的元素也不相等,如:Set(1,2,3)与List(1,2,3)不等价。
b、同范畴下的容器相等的条件:具有相同元素并且元素具有相同顺序。如:List(1,2,3)==Vector(1,2,3) ,HashSet(1,2,3)==TreeSet(3,2,1)
可变容器做HashMap的key时,这是一个陷阱
/* ---示例代码----*/

scala> val s = Set(1,2,3)
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
scala> val s1 = List(1,2,3)
s1: List[Int] = List(1, 2, 3)
scala> s == s1
res6: Boolean = false scala> var ss = collection.immutable.TreeSet(1,2,3)
ss: scala.collection.immutable.TreeSet[Int] = TreeSet(1, 2, 3)
scala> var ss1 = collection.immutable.HashSet(1,2,3)
ss1: scala.collection.immutable.HashSet[Int] = Set(1, 2, 3)
scala> ss ==ss1
res7: Boolean = true scala> import collection.mutable.{HashMap,ArrayBuffer}
import collection.mutable.{HashMap, ArrayBuffer}
scala> val buf = ArrayBuffer(1,2,3)
buf: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)
scala> val map = HashMap(buf -> 5)
map: scala.collection.mutable.HashMap[scala.collection.mutable.ArrayBuffer[Int],Int] = Map(ArrayBuffer(1, 2, 3) -> 5)
scala> map(buf)
res8: Int = 5
scala> buf(0) += 2
scala> map(buf)
java.util.NoSuchElementException: key not found: ArrayBuffer(3, 2, 3)
/* ---示例代码----*/
4、懒加载实现原理
容器中自带一些方法,对容器给入的参数进行加工处理转换成新的容器,称这些方法为转换器。如(map,filter,++)。
实现转换器有两种途径,一个叫紧凑法,另一个叫懒惰法(lazy)或松弛法。
紧凑法,就是一个容器及其所有单元构造成这个转换器(transformers)。
惰性法(lazy),就是一个容器及其所有单元仅仅是构造了结果容器的代理,并且结果容器的每个单元都是按单一需求构造的。
注:这两个概念不太好理解
个人理解:
紧凑法:就是每调一次方法就会立即执行并返回结果,然后再继续执行下一个方法。
惰性法:每次调用方法时只返回一个结果的代理,这个结果并没有真正处理数据,只有执行到最的一个强制性方法时,才会真正去执行。
/* ---示例代码----*/

scala> val v =Vector(1 to 10: _*)
v: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> v map (_ + 1) map(_* 2)
res11: scala.collection.immutable.Vector[Int] = Vector(4, 6, 8, 10, 12, 14, 16, 18, 20, 22) scala> val vv = v.view
vv: scala.collection.SeqView[Int,scala.collection.immutable.Vector[Int]] = SeqView(...)
scala> val vvv = vv map(_+2) map(_*2)
vvv: scala.collection.SeqView[Int,Seq[_]] = SeqViewMM(...)
scala> vvv.force
res12: Seq[Int] = Vector(6, 8, 10, 12, 14, 16, 18, 20, 22, 24) /* ---示例代码----*/

scala学习之第三天:数组的特性与使用技巧的更多相关文章

  1. Scala学习笔记(三):基础知识

    有了可运行的环境,就需要写一些简单的语句来认识一下Scala,本文没有写那么详细,只是为了方便查看.唤起回忆 (1)变量的定义方法 Scala有两种变量 var val 注意:在解释器中,可以用一个之 ...

  2. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

  3. Scala学习笔记(三)类层级和特质

    无参方法 功能:将方法的定义转换为属性字段的定义: 作用范围:方法中没有参数,并且方法仅能通过读取所包含的对象属性去访问可变状态,而不改变可变状态,就可使用无参方法: 例子: abstract cla ...

  4. Go语言学习笔记(三)数组 & 切片 & map

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 数组 Arrays 数组是同一种数据类型的固定长度的序列. 数组是值类型,因此改变副本的值,不会改变本身的值: 当 ...

  5. Scala学习笔记(四)—— 数组

    定长数组Array 定义定长数组用Array,有如下几种方法: 初始化一个长度为8的定长数组,其所有元素默认值均为0 scala> new Array[Int](8) res0: Array[I ...

  6. 快学Scala习题解答—第三章 数组相关操作

    3 数组相关操作  3.1 编写一段代码.将a设置为一个n个随机整数的数组,要求随机数介于0(包括)和n(不包括)之间  random和yield的使用 import scala.math.rando ...

  7. Scala学习系列(三)——入门与基础

    本课程源码共享于 https://github.com/tree1123/learning-scala 首先,打开IDEA编辑器的SbtExampleProject项目,我们将在这个项目下进行练习 本 ...

  8. Scala学习笔记(三):==,eq与equals的区别

    == Scala中==与java中不同,它是比较值是否相等的,无论比较对象是否是相同类型 List(1, 2, 3) == List(1, 2, 3) //true 1==1.0//true equa ...

  9. Scala学习笔记(三)—— 方法和函数

    1. 方法 方法使用 def 定义: def 方法名(参数名:参数列表,…) :返回值类型 = { 方法结构体 } scala> def add(x : Int ,y : Int):Int = ...

随机推荐

  1. 安卓开发_浅谈Service

    一.Service(服务) Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,区别在于它没有UI界面,是在后台运行的组件. public abst ...

  2. Android-AsyncTask异步任务(获取手机联系人)

    本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有 ...

  3. IOS开发-表单控件的应用

    1. 需求描述 2. 开发环境介绍 3. 创建一个工程 4. 工程配置介绍 5. 目录结构介绍 6. 界面设置 7. 关联输入输出 8. 关联事件代码 9. 运行结果 10. UITextField ...

  4. Web应用程序系统的多用户权限控制设计及实现-项目架构【3】

    本章主要讲述Web权限管理系统的项目架构,及开发中需要的基本类和相关的CSS,JS文件. 1.1系统结构 本系统搭建开发工具为Visual Studio 2012,采用ASP.NET MVC 4.0技 ...

  5. 日常工作生活中的做人做事道理[持续更新ing]

    1.凡是预则立,不预则废 2.不能用特殊案例说明事情本身的发展规律 3.任务不能拖,需主动出击,想方设法完成 4.工作要有细致化的沟通和安排 5.解决问题和安排任务可以逆向思维的去想 6.问题要举一反 ...

  6. android JSON解析之JSONObject与GSON

    1.写在前面 JSON数据是android网络开发中常见的数据格式,JSON最常见的传输方法是使用HTTP协议,关于android开发中HTTP协议的使用方法可参考我的另一篇随笔android网络编程 ...

  7. C语言指针学习(续)

    五.数组和指针的关系 int array[10] = {0,1,2,3,4,5,6,7,8,9},value; ... ... value = array[0];//也可以写成 value = *ar ...

  8. SQL Server同步复制问题排查方法

    1.应用复制的命令时在订阅服务器上找不到该行 解决方法:用系统存储过程sp_browsereplcmds(返回分发数据库中存储的可读版本复制命令的结果集,并将其用作诊断工具. 此存储过程在分发服务器上 ...

  9. Eclipse如何安装JD-Eclipse反编译插件

    一.Eclipse在线安装JD-Eclipse反编译插件 1.在eclipse的help—>Install New Software...中添加新软件开发,添加它的源: name:jd-ecli ...

  10. 使用Spring整合Hibernate,并实现对数据表的增、删、改、查的功能

    1.1 问题 使用Spring整合Hibernate,并实现资费表的增.删.改.查. 1.2 方案 Spring整合Hibernate的步骤: 1.3 步骤 实现此案例需要按照如下步骤进行. 采用的环 ...