Scala程序设计读书笔记[1:5]

简介:

Scala程序设计: Java虚拟机多核编程实战

一直好奇什么样的语言能够不需要加锁解决线程同步问题,能够解决Twitter的性能问题,想了解什么是函数式编程。于是找工作的间隙看了这本书,扩展一下视野。

Source Code: http://media.pragprog.com/titles/vsscala/code/vsscala-code.zip

Scala Online Editor:

URL: http://www.scala-tour.com/#/expression-and-values
API: http://www.scala-tour.com/run?code=println(%22abc%22)

第一章 简介

Scala混合了函数式和面向对象。用Scala创建多线程应用的时候,你会倾向于函数式编程风格,用不变状态编写无锁代码。Scala提供了一个基于actor的消息传递模型,消除了并发的数据竞争和加锁问题。

在函数式编程中,和ErLang相比的优势:a) 强类型,b) 运行与JVM,可以与Java互操作。

与JVM其他语言Groovy、JRuby和Clojure相比,优势是:能通同时提供函数式风格和良好并发支持的强类型语言。

Scala特性:

  • 基于事件的并发模型
  • 既支持命令式风格,也支持函数式风格
  • 纯面向对象的
  • 与Java混合
  • 强制使用自适应静态类型
  • 简洁而又表现力
  • 构建于一个微内核之上
  • 高度可扩展,用更少代码创建高性能应用

第二章 起步

下载地址:http://www.scala-lang.org 脚本运行建议sublime text+自定义build system。 编译scala可以使用IDE+插件http://www.scala-lang.org/old/node/91

第三章 Scala步入正轨

  1. val相对var初始化后不可改变变量指向其他引用

  2. 点和括号是可选的

  3. Scala把一切视作对象

  4. 元组和多重赋值

  5. 三引号的多行字符串以及前导符“|”

  6. 自适应默认做法:
    a) 支持脚本
    b) return可选,自动返回最后的求值表达式。如果使用return需要显式提供方法返回类型
    c) 分号半可选,可能产生歧义的时候需要加
    d) 类和方法默认public,不必显示写
    e) 轻量级JavaBean创建
    f) 不强制捕获不关心的异常

  7. 默认导入包: java.lang:常用java类型; scala:Scala类型; scalaPredef:类型,隐式转换及常用方法

  8. 运算符重载,实际没有运算符,是方法名省略了点和括号的方法。

  9. 复制结果是Unit,因此a=b=c在scala中不存在

  10. ==基于值比较,继承字Any类,为final。特定实现需要改写equals方法。基于引用比较需要使用eq方法。

  11. 细粒度访问控制,private和protected可以加访问控制,this或者包名

第四章 Scala的类

  1. 定义字段、方法和构造函数 Scala把主构造函数放到了类定义中。参数中的val转换成private final字段,并创建同名public取值方法。声明为var的定义为private,并创建public取值和赋值方法。都不是的话创建private字段和private的getter和setter。放到类定义中的任何表达式或者可执行语句都作为主函数的一部分。定义变量时_代表使用默认值。

  2. 类继承重写方法需要override关键字。副构造函数可以通过定义this方法实现。副构造函数第一条语句要么调用主构造函数,要么调用副构造函数。只有主构造函数才能往基类构造函数中传参数。

  3. 单例对象 使用object创建,不能给其主构造函数传递参数。

  4. 伴生对象 创建一个object和类同名,就是伴生对象。类和伴生对象之间没有界限,可以互相访问private内容。把类的构造函数标记为private就可以实现单例对象。

  5. static scala没有静态字段和静态方法,通过伴生对象支持类一级的操作。伴生对象加括号调用其apply方法。

第五章 自适应类型

  1. 静态类型 又称成编译时类型检查。scala根据定义或赋值推演类型,如果将其他类型赋给将会编译错误。

  2. Scala中特殊类型:Any、Nothing和Option

  3. import语句里的下划线相当于java中的星号。如果加在类名后相当于static import。默认引入当前目录。被引用的scala文件需要先scalac编译。

  4. 容器和类型推演 不带类型的容器实际传入了Nothing。因此带类型容器不能赋给不带类型容器的引用。也不能赋给Any类型的容器。只有容器类型相同才能赋给。

  5. Any类型 是所有Scala类型的超类,抽象类。方法由!=, =, asInstanceOf, equals, hashCode, isInstanceOf, toString。直接后代是AnyVal和AnyRef。AnyRef包含了Java的Object方法,如notify,wait,finalize。

  6. Nothing类型 所有类型的子类,实例不会存在,作用是帮助类型推演更加平滑。

  7. Option类型 Some[T]和None都继承自Option[T]。其getOrElse方法可以得到值,如果不存在,得到传入的参数。

  8. 方法返回类型推演 使用等号定义方法启用方法返回类型推演。

  9. 传递变参 如果方法接受参数需要指定参数名字及类型。末尾参数可以接受可变数目的实参,在类型信息后使用星号。但是不能传入数组。如果想将数组展开成离散值,可以用:_*

  10. Scala不支持协变和你变。子类实例容器赋给基类容器能力称为协变,超类实例容器赋给子类容器的能力称为逆变。

  11. 参数化类型的可变性 通过特殊语法实现子类数组当作父类数组:playWithPets[T <: Pet](pets: Array[T])。也可以将数组的参数化类型限定为源数组参数化类型的超类:copyPets[S, D >: S](fromPets: Array[S], toPets: Array[D])。可以把派生类容器当作基类的容器,实现协变:MyList[+T];也可以用-T实现逆变。

目录
相关文章
|
4月前
|
数据采集 人工智能 数据可视化
Scala多线程爬虫程序的数据可视化与分析实践
Scala多线程爬虫程序的数据可视化与分析实践
|
缓存 负载均衡 并行计算
|
Java 编译器 Scala
SCALA程序设计 第三章:控制结构和函数
SCALA程序设计 控制结构和函数
|
Java Scala
|
安全 JavaScript 前端开发
SCALA程序设计 第一章:scala简介
Scala是一门静态类型语音,是一门以Java虚拟机为目标运行环境并将面向对象和函数式编程语言的最佳特性结合在一起的编程语言。
159 0
|
存储 Unix Java
《C语言程序设计现代方法(第2版)》读书笔记 第二章(二)
《C语言程序设计现代方法(第2版)》读书笔记 第二章(二)
《C语言程序设计现代方法(第2版)》读书笔记 第二章(二)
|
程序员 编译器 C语言
第五章 选择语句《C语言程序设计现代方法(第2版)》读书笔记(二)
第五章 选择语句《C语言程序设计现代方法(第2版)》读书笔记(二)
第五章 选择语句《C语言程序设计现代方法(第2版)》读书笔记(二)
|
存储 C语言
第五章 选择语句《C语言程序设计现代方法(第2版)》读书笔记(一)
第五章 选择语句《C语言程序设计现代方法(第2版)》读书笔记(一)
第五章 选择语句《C语言程序设计现代方法(第2版)》读书笔记(一)
|
存储 Unix 编译器
第七章 基本类型《C语言程序设计现代方法(第2版)》读书笔记(二)
第七章 基本类型《C语言程序设计现代方法(第2版)》读书笔记(二)
第七章 基本类型《C语言程序设计现代方法(第2版)》读书笔记(二)