当前位置:网站首页>《scala 编程(第3版)》学习笔记
《scala 编程(第3版)》学习笔记
2022-08-08 21:26:00 【Code_LT】
《scala 编程(第3版)》学习笔记
持续更新中…
第2章 入门1
- 函数式编程的核心一,函数是一等的。P9
- 函数式编程的核心二,程序操作应当将输入映射成输出。不要有副作用。副作用是指改变了环境量。P10。原因:函数相互不纠缠,更可靠,更容易复用。P38
- 函数是递归的,必须显示给出函数的结果类型。P25
- 函数字面量: 参数列表=> 函数体,加参数类型时,必须用括号。
(x:Int)=>2*x
。 P31。若类型可靠类型推断实现,则可省略括号。a.foreach(x=>x+2)
。P147。 - 函数字面量只接收单个参数时,可不写参数。
arr.forecch(println)
。P31
第3章 入门2
- new用来创建对象或类的实例。实例可参数化可接收类型和参数:
val a=new 对象名[类型](参数),如 val a=Array[Int](3)
。P33 - 通用规则:如果方法只接收一个参数,则调用他它的时候,可不用
.
和()
,如0 to 2
为(0).to(2)
。P35 这叫操作符表示法,任何方法都可以是操作符,若有多个参数,则可把多参数写在()里,如a fun (c,d)
。P79 - 通用规则:
a(i)
实际上是a.apply(i)
的简写。i可换成多值。P36 - 通用规则:
a(i)="hello"
实际上是a.update(i,"hello")
。P36 - 注意区分类的方法和对象的方法。P37
- Array可变,List不可变。
a(1)=2可以,l(1)=2不可以
。P38 - List操作:1)拼接
l1_2=l1:::l2
2)前面添加l2=3::l1
,常量时间完成3)追加:l2=l1:+3
少用!列表越长追加时间越长。用追加的话可用ListBuffer再转List。P40 - 右操作元:方法名一冒号:结尾,是右操作元,
3::l1//l1.::(3)
P39 - Nil可表示空列表,即List(),
l1=1::2::3::Nil
等价于’''l1=List(1,2,3)```P40 - List方法:count,init,tail, forall,sort。 P42
- 元组:也不可变,和List不同的是可装不同元素。P42
- 元组一个用处是函数返回多个对象时使用。P42
- 元组用._N取值,原因:t(N)形式时t.apply(),apply要求返回一致的类型,而元组支持不同类型返回。P43
- +=:
a+="1"
,有的是简写a=a+"1"
,有的是方法a.+=("1")
。P45 - ->:
a -> b 实际上是 a.->(b),返回的是元组(a,b)
。scala允许任何对象调用->,通过隐式转换实现。P47 - 用reduce方法来减少var的使用,如
arr.reduceLeft((a,b)=>b)
。P53
第4章 类和对象
- private 指明私有字段,只能被类内方法访问。P58
- 不当做断句:1)行末是句点或中缀操作符 (+,-,*等) 2)下一行以不能作为语句开头的词开头 3)行尾在()和[]内。P62
- 单例对象用来实现类似java类的静态成员能力。当有类名和单例对象同名时,单例对象叫伴生对象,类叫伴生类。他们可以相互访问对方私有成员,且必须在同一个源码文件中定义。P63
- 类的实例,无法访问伴生对象中的方法。P63
- 单例对象不接受参数,不能被new实例化,只在代码首次访问时才被初始化。P65
- 没有伴生类的单例对象叫孤立对象,孤立对象一般用于把方法归集到一起或者定义应用程序入口。P65
- 所有应用程序的对象,需要有main函数,且结果输出为Unit。P65
- 脚本需要以计算结果表达式结尾。P66
- fsc来编译非脚本文件。编译后,可直接
scala 类名 参数
来调用scala应用程序。P67 - App特质可省略main外壳。直接args使用参数。P68
第5章 基础类型和操作
- Int,Long,Short,Byte整数字面量有两种,0xca(或0Xca十六进制),123(十进制)或123L。P71
- shell总是以十进制打印整数。P71
- 赋值给Short和Byte,只要在合法取值内即可。
val a:Byte=23
。P72 - 浮点字面量:十进制数+小数点(+e/E+F/D)如:
12.34e13D
。P72 - 字符字面量:‘原字符’或’\uUnicode码’。P73
- Unicode码可出现在scala程序的任何位置,本意时让非ASCII的Unicode字符在源文件中也能用ASCII码表示。
val B\u0041\u0044=1等价于val BAD=1
。P74 """|原生字符串“”“.stripMargin
有较多坑,不同环境调用的换行符不同(\n或\r\n),导致预期不符。P75- 符号字面量(略)P75
- 布尔字面量
true,false
。P76 - 字符串插值。P77
- s:
s" str ${表达式}
。 - raw: 和s一样,只不过里面的\不转义。
- f: java.util.Formatter中给出的语法。例
f"${math.Pi}%.5f"
。默认为%s
。
- s:
- 任何方法都可以是操作符。P79
- 前缀操作符是
unary_操作符
的简写,unary(一元的),如-7 为 7.unary_-
。仅-、+、!、~
可用作前缀操作符。自定义前缀操作符也只能选这四个,如自定义一个unary_!
方法。P80 - 后缀操作符是不接受参数,且在调用时不用括号和局点的方法。如
7 toLong
。P81 - 约定俗成:如果方法有副作用,则要保留括号。如
println()
。如果没有副作用,则可用后缀操作符法表示。如s toLowerCase
。P82 &&
和||
是短路的,&
和|
是非短路的。P83- 位操作:按位与
&
,按位或|
,按位异或^
,按位取反~
P85 - 位移操作:
<<
左移,>>
右移,>>>
无符号右移。<<
和>>>
自动填充0,>>
用左侧最高位填充。P85。 - 相等性:
==
,!=
可放心用于所有对象,已做好了null值处理,如a == null
。P87 - 操作符优先级:为保证程序可读性,建议老实用括号标出优先级。复杂难懂的直接查资料。P89
- 富操作:scala的基础类都可自动隐式转换成富类型,从而获得更多方法。如
0 max 5
就是Int类型隐式转换成了scala.runtime.RichInt。P92
第6章 函数式对象
本章主要讨论不可变对象。
- 不可变对象优势P95:
- 容易推理,时不变。
- 自由传递。可变对象则需做保护式拷贝。
- 可做哈希表里的键。
- 劣势P95:
- 不能做局部更新,每次都要完整拷贝。
- 主构造器、辅助构造器与私有构造器
- Scala中,每个类都有主构造器,但并不以this定义。主构造器会执行类定义中的所有语句,即定义时{}中的所有内容。
class YourClass{
...
}
- 辅助构造方法以
def this(...)
开始。每个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始。P102 require
函数的使用。P98- 类的类参数不能直接引用,想要实例引用参数,则要把它们做成字段。P99
scala> class Rational(n:Int,d:Int)
defined class Rational
scala> val a=new Rational(1,2)
a: Rational = Rational@5c669da8
scala> a.n
<console>:14: error: value n is not a member of Rational
a.n
- 自引用。关键字this指向当前执行方法的调用对象。有时this可省略,有时不可省。P100
- 私有化。private字段标识,只能在类定义内部访问,外部是访问不到的(博主注:即通过实例或者类名无法访问)。P103。复习:伴生对象和伴生类可相互访问私有成员。 私有成员不能被继承。
- 定义操作符。
def 操作符
,如def +(that: Cls){}
,定义出来的操作符,任遵守操作符优先级。如a+b*c
,还是a+(b*c)
。 - Scala的常量一般用首字母大写驼峰命名。
- 方法与函数:Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。
//定义,:,=都不是必须的
def functionName ([参数列表]) [: [return type]] [[=][方法实现]
//例:
ef a: Int={
1+1}
def a={
1+1}//等价
def a{
1+1}//等价
边栏推荐
猜你喜欢
【公开课预告】:AV1编码器的优化及其在流媒体和实时通讯中的应用
为什么要做LiveVideoStack课程?
使用v-for完成图标单选三选一
“文化数字化战略新型基础设施暨文化艺术链生态建设发布会”成功召开
百度 IP 查询
如果只让我推荐一本书。(第2弹)
零数科技受邀出席2019全球未来出行大会
第十章 异常处理
"New Infrastructure of Cultural Digital Strategy and Ecological Construction of Cultural Art Chain" was successfully held
1个不为人知的 Jupyter notebook 使用技巧,今天分享出来。
随机推荐
LiveVideoStackCon 2022 上海站明日开幕!
Move your office environment anywhere with a solid state USB drive
中国石油大学(北京)-《 渗流力学》第二阶段在线作业
上下分页功能实现
峰会•沙龙•招聘 | 记零数科技多线并进的一天
Crawler Series: Storing CSV Files
爬虫系列:存储媒体文件
What is the cURL?
ES6新特性let和const
数据告诉你:中国足球还有理论性出线的可能吗?
Invalid keystore format报错问题解决
为什么要做LiveVideoStack课程?
position的值,relative和absolute分别相对谁定位
音视频技术开发周刊 | 257
波动数列,简易AC代码,详细讲解。
爬虫系列:使用 MySQL 存储数据
用js写一个简单的前世今生
1个不为人知的 Jupyter notebook 使用技巧,今天分享出来。
又来了!今天再分享几个Jupyter Notebook的使用技巧!
关于RecyclerView布局