【《快学Scala》笔记】

一、基础

1、变量
val 标志符: 声明常量; 如,val answer = 1
var 标志符:声明变量;

  • 类型推断:变量的类型由scala根据初始化变量的表达式推断而来;

  鼓励使用val;

  注:声明变量时不做初始化会报错。

  • 明确类型: scala的变量或函数的类型总是写在变量或函数的后面。
   val a:Int = 1
  val str:String = 2

2、常用类型

Scala支持7种数值类型和1种Boolean类型。

  • Byte/Char/Short/Int/Long/Float/Double
  • Boolean

注:所有这些类型都是类,Scala并未区分基本类型与引用类型。如,可以调用1.toString方法。

3、数值类型转换:

Scala中使用方法,而非强制类型转换来做数值类型之间的转换。如,

  

4、操作符

Scala支持Java中绝大多数操作符,不过所有的操作符都是方法。如:

  a+b 是 a.+(b) 的缩写

即:a 方法 b 是 a.方法(b) 的缩写,两种写法可以互换。

【注:Scala不支持 ++ 和 -- 操作符。】

5、函数调用和方法

常用数学函数包括在scala.math包中,可以通过如下语句引入包。

 import scala.math._     // Scala中,字符 _ 是通配符,类似Java中的*

另外,以scala开头的包,在引入或使用时可以省略scala。

 import math._
math.sqrt(2)

【注:Scala中没有静态方法。】

不带参数的方法在调用时可以省略括号,如:

     "hello World".toString

6、apply方法

在Scala中通常使用类似函数调用的形式来访问数组、链表等的元素。如:

  

上述调用中,"hello"(0)是"hello".apply(0)的调用。其中apply方法是StringOps类中的方法。

二、控制结构和函数

1、if语句也有返回值

if语句称为条件表达式,如:

  

条件表达式的结构为:  if( 判断条件 ) 值1 else 值2   ;结构类似于 Java的三目运算符,但是Scala不支持三目运算符

该条件表达式可以用来初始化val常量。

注:Scala中每个表达式都会返回值,如

  

条件表达式返回了 () ,其中 () 表示Unit类,表示没有值。可以看作Java中的void类型。

2、Scala不支持switch语句,但是Scala有更强大的模式匹配机制。

3、块表达式

Scala中使用 {} 括起来一系列表达式,其 {} 括起来包括 {} 的部分叫做块表达式,块表达式的值是块中的最后一个表达式的值。如,

  ,结果为7。

可以使用块表达式为变量赋值,如:

  

变量distance使用块表达式来赋值,其值为块中最后一个表达式的值。

4、Scala中赋值语句的返回值为Unit,也可记作:Scala中赋值语句是没有返回值的。

  

【注:  x = y = 3; 这种赋值形式在Scala中不支持,因为赋值语句在Scala中无返回值。 所以, += 、-= 、 ×= 、/= 等赋值操作符都是无返回值的。】

5、输入、输出

  • 输入:

  常用的包括readLine从控制台读取一行输入,另外,readLine还可带有提示字符串,如:

  

  readInt、readByte、readDouble、readShort、readLong、readFloat、readBoolean、readChar分别用于读取各自类型的值。

  • 输出:

  print(内容)、println(内容)、printf; 其中println带换行;另外,printf支持C风格的字符串输出,如:

  

6、循环操作

Scala支持Java相同的while和do循环:

  

Scala的for循环结构:( for循环中,变量前面不带var或val标志符)

     for( 变量 <- 表达式 ){ //让变量遍历表达式的所有值

//操作 }

如:

  

7、for循环的高级用法

  • 可以在for循环括号里同时包含多组" 变量 <- 表达式 "结构,组之间用分号分隔,如
     for( i <- 1 until 3; j <- 1 until 3 ){
println( i*j )
}

for循环的这种结构类似Java中的嵌套循环结构。

另外,可以采用

     for{ i <- 1 until 3     //使用大括号,使用换行来分隔组
j <- 1 until 3 }{ println( i*j )
}
  • 可以为嵌套循环通过if表达式添加条件:

  

  if表达式是否添加括号,结果无变化。

  

  until 返回一个不包含上界的区间,如 1 until 3 返回 (1,2);

  

  to方法返回一个包含善洁的区间,如 1 to 3 返回(1,2,3);

  • for推导式

  如果for循环以yield开始,for循环会构造出一个集合,保存到集合中。

  

8、Scala并不支持break和continue;

9、函数—Scala支持函数式编程

     def 函数名(参数1:类型1, 参数2:类型2,... ):返回值类型 = {

         //函数体

     }

例如:

  

【注:对于有返回值的函数,不能省略 等号 ;  对于递归函数,不能省略函数返回值类型。】

  

【注:无返回值的函数定义时可以省略 等号 ;无返回值的函数返回类型是 Unit;】

10、带默认值的函数

  

带默认值函数的声明,与Java中的带默认值的方法很类似。

11、带名参数——在函数调用时通过明确指明参数与其对应值

  

第一个函数调用为普通调用,第二个函数调用为带名参数调用。

12、长度可变的参数列表

通过在函数的形参列表最后一个参数的类型后,添加*,来定义一个接受任意多个参数的函数。

  

13、过程,Scala中将没有返回值的函数叫做过程,如上图所示的函数。

过程在定义的时候,参数列表之后无等号。

14、懒值

但val被声明为lazy时,变量的初始化将被延迟,直到我们首次对变量取值。例如:

     lazy val fileContent = scala.io.Source.fromFile("filename").mkString

只有当我们读取fileContent值时,fileContent才会通过读取文件来进行初始化。若我们一直未读取fileContent值,这文件不会被读取。

15、Scala没有“受检”异常——无需声明函数或方法可能会抛出某种异常。

Scala学习——基础篇的更多相关文章

  1. Docker虚拟化实战学习——基础篇(转)

    Docker虚拟化实战学习——基础篇 2018年05月26日 02:17:24 北纬34度停留 阅读数:773更多 个人分类: Docker   Docker虚拟化实战和企业案例演练 深入剖析虚拟化技 ...

  2. [转]C++学习–基础篇(书籍推荐及分享)

    C++入门 语言技巧,性能优化 底层硬货 STL Boost 设计模式 算法篇 算起来,用C++已经有七八年时间,也有点可以分享的东西: 以下推荐的书籍大多有电子版.对于技术类书籍,电子版并不会带来一 ...

  3. ios学习基础篇一

    搜集的不错的oc学习资料 大概总结: http://my.oschina.net/luoguankun/blog/208526 详细教程: http://www.w3cschool.cc/ios/io ...

  4. Laravel学习基础篇之--路由

    终于还是决定再多学一门重量级框架,当然首选必备还是被称为最优雅的Web开发框架--Laravel 对于框架的入门,首先了解它的路由规则是先前必备的,以下是laravel 中几种常见的基础路由规则 // ...

  5. Flume搭建及学习(基础篇)

    转载请注明原文出处:http://www.cnblogs.com/lighten/p/6830439.html 1.简介 该文主要是翻译官方的相关文档,源地址点击这里.介绍一下Flume的一些基本知识 ...

  6. Bat 脚本学习 (基础篇)

    [转]Bat 脚本学习 2015-01-05 14:13 115人阅读 评论(0) 收藏 举报 基础部分: ============================================== ...

  7. Python ( 学习 基础篇第一部 )

    目录 注释 注释的分类 注释的注意点 变量 变量的概念 变量的声明 变量的命名 变量的交换 变量的缓存机制 常量 进制 进制的转换 原码 反码 补码 六大数据类型 Number 的四大类 字符串 st ...

  8. Scala学习——基础入门

    基础语法 1)注意点 1)区分大小写 -  Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义. 2)类名 - 对于所有的类名的第一个字母要大写. 3)方法名 ...

  9. [性能测试] locust学习-基础篇

    在本文中,我将介绍一个名为Locust的性能测试工具.我将从Locust的功能特性出发,结合实例对Locust的使用方法进行介绍. 概述 Locust主要有以下的功能特性: 在Locust测试框架中, ...

随机推荐

  1. Servlet之过滤器

    Servlet的介绍: Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfig Filter 程序是一个实 ...

  2. pl/sql developer 中文字段显示乱码

    在windows中创建一个名为“NLS_LANG”的系统环境变量,设置其值为“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”,然后重新启动 pl/sql developer,这样 ...

  3. UVALive 3645 Objective: Berlin(最大流 :时序模型)

    题意:已知n(n <= 150)个城市和m(m <= 5000)个航班,每个航班有出发地.到达地.乘坐人数.起飞时间和降落时间(时间用时和分表示),求从一个指定城市出发,去往另一个指定城市 ...

  4. 《java编程思想》--多线程基础--Runnable

    一.简单说下Runnable是什么 1.它是一个接口 2.只提供了run方法 3.这个接口提供了一个协议:实现这个接口的类是active的(不必成为Thread的子类) 4.run方法没有返回值 /* ...

  5. ECMAScript 5.1 Edition DOC 学习笔记

    1.类型 string number object boolean null undefined symbol (es6) attention : (typeof null) 值为 'object', ...

  6. 仿360手机卫士界面效果android版源码

    仿360手机卫士界面效果android版,这个今天一大早在源码天堂的那个网站上看到了一个那个网站最新更新的一个源码,所以就分享给大学习一下吧,布局还挺不错的,而且也很简单的,我就不把我修改的那个分享出 ...

  7. JAVA中的代理技术(静态代理和动态代理)

    最近看书,有两个地方提到了动态代理,一是在Head First中的代理模式,二是Spring AOP中的AOP.所以有必要补充一下动态代理的相关知识. Spring采用JDK动态代理和CGLib动态代 ...

  8. Java http post

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  9. Notepad++ 运行脚本快捷键设置

    php:cmd /k /path/to/php.exe "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT pyth ...

  10. 爬虫学习之基于Scrapy的爬虫自动登录

    ###概述 在前面两篇(爬虫学习之基于Scrapy的网络爬虫和爬虫学习之简单的网络爬虫)文章中我们通过两个实际的案例,采用不同的方式进行了内容提取.我们对网络爬虫有了一个比较初级的认识,只要发起请求获 ...