scala读书学习笔记002

1、Scala的变量分为两种:val和var。val跟Java的final变量类似,一旦初始化就不能被重新赋值。而var则不同,类似于Java的非final变量,在整个生命周期内var可以被重新赋值。(scala的类型推断(typecala的类型推断(type inference)能力——能够推断出那些不显式指定的类型).
显式的类型标注,既可以确保Scala编译器推断出符合你意图的类型,也能作为文档,方便今后阅读代码的人更好地理解代码。跟Java不同,Scala并不是在变量名之前给出类型,而是在变量名之后,变量名和类型之间用冒号(:)隔开。


2、函数定义由def开始,然后是函数名和圆括号中以逗号隔开的参数列表。每个参数的后面都必须加上以冒号(:)开始的类型标注,因为Scala编译器并不会推断函数参数的类型。在函数的结果类型之后,是一个等号和用花括号括起来的函数体。函数体之前的等号也有特别的含义,表示在函数式的世界观里,函数定义的是一个可以获取到结果值的表达式。如果函数只有一条语句,也可以选择不使用花括号。


3、Unit这样的结果类型表示该函数并不返回任何有实际意义的结果。Scala的Unit类型跟Java的void类型类似,每一个Java中返回void的方法都能被映射成Scala中返回Unit的方法。


4、scala编译器会忽略//和下一个换行符之间的字符,以及/*和*/之间的字符。


5、在Scala中(这一点跟Java一样),while或if语句中的boolean表达式必须放在圆括号里。Scala跟Java一样,也支持用分号来分隔语句,只不过Scala的分号通常不是必需的。


6、Scala对函数字面量的一个特殊简写规则。如果函数字面量只是一个接收单个参数的语句,可以不必给出参数名和参数本身。函数字面量的语法是:用圆括号括起来的一组带名字的参数、一个右箭头和函数体。


7、为了鼓励和引导大家使用更函数式的编程风格,Scala只支持指令式for语句的函数式亲戚(这个亲戚叫作for表达式)


8、arg<- args。位于<-符号右边的,是我们熟知的args数组。而在<-符号的左边是“arg”,这是一个val变量的名字,注意它不是var(因为它总是val,只能写成“arg”而不是“val arg”)。尽管arg看上去像是var,因为每一次迭代都会拿到新的值,但它确实是个val。


8、scala的数组的访问方式是将下标放在圆括号里,而不是像Java那样用方括号。


9、Scala中所有操作都是方法调用。Scala将从数组到表达式的一切都当作带有方法的对象来处理。在Scala中访问一个数组的元素就是一个简单的方法调用,跟其他方法调用一样。当然,这样的代码仅在对象的类型实际上定义了apply方法时才能编译通过。


10、Scala数组是一个拥有相同类型的对象的可变序列。例如一个Array[String]只能包含字符串。虽然无法在数组实例化以后改变其长度,却可以改变它的元素值。因此,数组是可变的对象。


11、对于需要拥有相同类型的对象的不可变序列的场景,可以使用Scala的List类。跟数组类似,一个List[String]只能包含字符串。Scala的List(即scala.List)跟Java的java.util.List的不同在于Scala的List是不可变的,而Java的List是可变的。更笼统地说,Scala的List被设计为允许函数式风格的编程。


12、List有个方法叫“:::”,用于列表拼接,在表达式“1 :: twoThree”中,::是它右操作元(rightoperand,即twoThree这个列表)的方法。表示空列表的快捷方式是Nil,初始化一个新的列表的另一种方式是用::将元素串接起来,并将Nil作为最后一个元素。+表示在列表尾添加元素,因为往列表(末尾)追加元素的操作所需要的时间随着列表的大小线性增加,而使用::在列表的前面添加元素只需要固定的时间(constant time)。如果想通过追加元素的方式高效地构建列表,可以依次在头部添加完成后,再调用reverse。也可以用ListBuffer,这是个可变的列表,它支持追加操作,完成后调用toList即可。


13、跟list类似,元组也是不可变的,不过跟list不同的是,元组可以容纳不同类型的元素。列表可以是List[Int]或List[String],而元组可以同时包含整数和字符串。要实例化一个新的元组,只需要将对象放在圆括号当中,用逗号隔开即可。一旦实例化好一个元组,可以用英文句点、下画线和从1开始的序号来访问每一个元素,元组的实际类型取决于它包含的元素以及元素的类型。


14、访问元组中的元素,你也许正好奇为什么不能像访问列表元素,也就是“pair(0)”那样访问元组的元素。背后的原因是列表的apply方法永远只返回同一种类型,但元组里的元素可以是不同类型的:_1可能是一种类型,_2可能是另一种,等等。这些_N表示的字段名是从1开始而不是从0开始的,这是由其他同样支持静态类型元组的语言设定的传统,比如Haskell和ML。


15、数组永远是可变的,列表永远是不可变的。Scala同时还提供了集(set)和映射(map)的可变和不可变的不同选择,但使用同样的简单名字。对于集和映射而言,Scala通过不同的类继承关系来区分可变和不可变版本


16、Scala编译器会将二元(binary)的操作,比如1-> "Go to island.",转换成标准的方法调用,即(1).->("Go to island.")。因此,当你写1-> "Go to island."时,实际上是对这个值为1的整数调用->方法,传入字符串"Go to island."。可以在Scala的任何对象上调用这个->方法,它将返回包含键和值两个元素的元组


17、一个显著的标志是如果代码包含任何var变量,它通常是指令式风格的;而如果代码完全没有var(也就是说代码只包含val),那么它很可能是函数式的。因此,一个向函数式风格转变的方向是尽可能不用var。


18、scala鼓励使用函数式风格的原因就是这样能帮助你实现更易读、更少出错。带有副作用的函数的标志性特征是结果类型为Unit。如果一个函数并不返回任何有意义的值,也就是Unit这样的结果类型所表达的意思,那么这个函数存在于世上唯一的意义就是产生某种副作用。每个有用的程序都会有某种形式的副作用。否则,它对于外部世界就没有任何价值。倾向于使用无副作用的函数鼓励你设计出将带有副作用的代码最小化的程序。这样做的好处之一是让你的程序更容易测试。
Scala程序员的平衡心态倾向于使用val、不可变对象和没有副作用的方法,优先选择它们。不过当你有特定的需要和理由时,也不要拒绝var、可变对象和带有副作用的方法。


19、reduceLeft方法将传入的函数应用到lines的头两个元素,然后继续将这个传入的函数应用到前一步得到的值和lines中的下一个元素,直到遍历完整个列表。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值