文档章节

Scala学习笔记(3)-数组集合元组

李白吃白菜
 李白吃白菜
发布于 2015/08/14 11:59
字数 1122
阅读 32
收藏 0

1.带类型的参数化数组

val greetStrings= new Array[String](3)

其中Array[String]变量greetStrings的类型,3为实例初始化参数。

Scala里的数组是通过把索引放在圆括号里面访问的,而不是像Java那样放在方括号里。所以数组的第零个元素是greetStrings(0),不是greetStrings[0]。

Scala如何看待val的意义的重要概念。当你用val定义一个变量,那么这个变量就不能重新赋值,但它指向的对象却仍可以暗自改变。所以在本例中,你不能把greetStrings重新赋值成不同的数组;greetStrings将永远指向那个它被初始化时候指向的同一个Array[String]实例。但是你能一遍遍修改那个Array[String]的元素,因此数组本身是可变的。

2.不可变List

方法不应该有副作用是函数风格编程的一个很重要的理念。方法唯一的效果应该是计算并返回值。用这种方式工作的好处就是方法之间很少纠缠在一起,因此就更加可靠和可重用。另一个好处(静态类型语言里)是传入传出方法的所有东西都被类型检查器检查,因此逻辑错误会更有可能把自己表现为类型错误。把这个函数式编程的哲学应用到对象世界里意味着使对象不可变。

Scala的List,scala.List,不同于Java的java.util.List,总是不可变的(而Java的List可变)

当你在一个List上调用方法时,似乎这个名字指代的List看上去被改变了,而实际上它只是用新的值创建了一个List并返回。比方说,List有个叫“:::”的方法实现叠加功能。你可以这么用:

val oneTwo = List(1, 2)
val threeFour = List(3, 4)
val oneTwoThreeFour = oneTwo ::: threeFour
List最常用的操作符是发音为“cons”的‘::’。Cons把一个新元素组合到已有List的最前端,然后返回结果List。例如:
val twoThree = List(2, 3)
val oneTwoThree = 1 :: twoThree
 println(oneTwoThree)

注:不用写成new List因为“List.apply()”是被定义在scala.List伴生对象上的工厂方法(后面章节会介绍伴生对象)

由于定义空类的捷径是Nil,所以一种初始化新List的方法是把所有元素用cons操作符串起来,Nil作为最后一个元素。

val oneTwoThree = 1 :: 2 :: 3 :: Nil

Scala的List包装了很多有用的方法,具体的可以自己去查。

2个List比较相同可以用==去做比较。

3.元组(Tuple)

与列表一样,元组也是不可变的,但与列表不同,元组可以包含不同类型的元素。元组很有用,比方说,如果你需要在方法里返回多个对象。Java里你将经常创建一个JavaBean样子的类去装多个返回值,Scala里你可以简单地返回一个元组。

val pair = (99, "Luftballons")
 println(pair._1)
 println(pair._2)

注:尽管理论上你可以创建任意长度的元组,然而当前Scala库仅支持到Tupe22

4.可变和不可变Set、Map

上面介绍的数组是可变的,List是不可变的,而对于Set和Map,Scala提供了可变和不可变两种选择。

他们的简化名都是Set和Map,然而它们的全称不一样,因为每个都放在不同的包里,二者缺省定义都是不可变的。

如Set不可变的scala.collection.immutable.Set,可变的scala.collection.mutable.Set
import scala.collection.immutable.Map
var jetSet = Set("Boeing", "Airbus")//这里定义的是不可变集
jetSet += "Lear" //因为是不可变集,所以这里的+=其实是重新赋值jetSet,所以jetSet要声明成var而不是val
println(jetSet.contains("Cessna"))

要向集加入新的变量,可以在集上调用+,传入新的元素。可变的和不可变的集都提供了+方法,但它们的行为不同。可变集将把元素加入自身,不可变集将创建并返回一个包含了添加元素的新集。

Map和Set一样,Scala采用了类继承机制提供了可变的和不可变的两种版本的Map
import scala.collection.mutable.Map
val treasureMap = Map[Int, String]()//定义一个可变的Map,因为是可变的,所以不需要对treasureMap 重新赋值,所以它是val
treasureMap += (1 -> "Go to island.")
treasureMap += (2 -> "Find big X on ground.")
treasureMap += (3 -> "Dig.")





本文转载自:http://my.oschina.net/shajin/blog/156773

李白吃白菜
粉丝 12
博文 33
码字总数 18863
作品 0
朝阳
私信 提问

暂无文章

为构建社交关系链手淘都做了啥?

作者|王卫(泓冰) 出品|阿里巴巴新零售淘系技术部 01、淘宝社交关系推荐的背景 1、互联网下半场到来:互联网的下半场,人口红利消失,各大平台需要对用户做精细化运营,用户的增长和留存是每一...

阿里云官方博客
12分钟前
3
0
Iaas/Paas/Saas有何区别,一个故事告诉你

云计算有三种服务模式,IaaS,PaaS和SaaS。单从英文全称去理解,他们分别是“基础设施即服务”“平台即服务”和“软件即服务”。 这样翻译过来可不好理解,但是我们可以举个例子。现在我们就以...

JEPaaS云平台
19分钟前
3
0
温度传感器怎么测好坏

  温度传感器也就是负温度系数热敏电阻,温度越高,电阻越小,测量时先看其阻值能不能根据温度的变化而变,再看其变化的阻值是不是在标定的范围之内。   有以下四种方法;   1、若是有...

仙溪
20分钟前
3
0
zk中ZooKeeperServer解析

内部类 ChangeRecord 处理PrepRP和FinalRP之间的信息 static class ChangeRecord { ChangeRecord(long zxid, String path, StatPersisted stat, int childCount, List<ACL> acl) {......

writeademo
30分钟前
3
0
LNMP---安装worrdpress、discuz,域名重定向,用户认证,nginx访问日志

4.34 安装wordpress 4.35 安装discuz 4.36 域名重定向 4.37 用户认证 4.38 nginx访问日志 一、安装wordpress 创建博客: 添加一个博客的虚拟主机 blog.tobe.com.conf 做如下更改 安装博客wor...

tobej
32分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部