Scala从入门到精通

第一章

1. scala简介

scalable language,运行在jvm上,面向对象和面向函数式编程。

兼容java,可以访问庞大的java类库

2. scala与java对比

执行流程

3. scala环境搭建

IDEA插件下载地址:http:/.plugins.jetbrains.com/plugin/1347-scala

版本必需和IDEA保持一致

下载插件后,IDEA使用从本地安装插件

4. scala解释器

cmd -> scala

(1)hello world

第二章

2.1 输出语句和分号

1. 输出语句

  换行输出:println

  不换行输出:print

  输出多个值:println(value1, value2, value3...)

2. 分号

  可以写,也可以不写

2.2 常量

1. 分类

(1)字面常量:整型常量(如:2),浮点型常量(如:1.2),字符常量(如:'a'),字符串常量(如:"abc"),布尔常量(如:true, false),空常量(如:null)

(2)自定义常量

2.3 变量

1. 语法格式

val/var 变量名:变量类型 = 初始值

其中:

val定义的是不可重新赋值的变量,也就是自定义常量

var定义的是可以重新赋值的变量

2. 示例

定义一个变量保存一个人的名字“tom”

val name:String = "tom"

3. 类型推断

val name = "tom"

2.3 字符串

三种定义方式:

(1)使用双引号

(2)使用插值表达式

(3)使用三引号

1. 使用双引号

var name = "hadoop"
println(name + name.length) //hadoop6

2. 使用插值表达式

如果涉及大量字符串的拼接,使用插值表达式

val/var 变量名 = s"${变量/表达式}字符串"

示例:定义变量保存“zhagnsan”, 23, "male",定义字符串打印输出:name=zhangsan, age=23, sex=male

val name = "zhangsan"
val age = 23
val sex = "male"
val info = s"name = ${name}, age = ${age}, sex = ${sex}"
println(info) //name = zhangsan, age = 23, sex = male

3. 使用三引号

如果涉及大段文本

val sql = """
     select *
     from stu
     where name = 'zhangsan'
     and age = 23
     order by addr;
     """
println(sql)

4. 惰性赋值

lazy val/var 变量名 = 表达式

2.4 标识符

1. 变量或方法名:小驼峰命名法

2. 类或特质:大驼峰命名法

3. 包:全部小写,多级目录使用"."隔开

2.5 数据类型

 1. 类型继承图

(1)Any:所有类型的父类,相当于java中的Object类

(2)AnyVal:所有数值类型的父类

(3)AnyRef:所有引用类型的父类

(4)Unit:相当于java中的void

(5)Null:所有引用类型的子类,它的值只有null

(6)Nothing:所有数据类型的子类,它一般结合异常来进行使用

 2. 判断是否有误

val b:Int = null //报错,Int是数值类型,null是引用类型

2.6 类型转换

1. 强制类型转换

val/var 变量名:数据类型 = 具体的值.toXXX
例如:
var age = 3.14.toInt //3

2. 值类型数据转成字符串类型数据

val/var 变量名:String = 值类型数据 + ""
val/var 变量名:String = 值类型数据.toString

3. String类型转换成值类型数据

(1)转成Char的方法是“.toCharArray”

2.7 键盘录入

1. 使用步骤

(1)导包:import scala.io.StdIn

(2)通过StdIn.readxxx()来接收用户录入的数据:StdIn.readLine(), StdIn.readInt ()

第三章

3.1 算术运算符

1. 字符串与整数使用乘法计算,相当于字符串拷贝n份

2. 取模运算:a % b = a - a / b * b (10 % 3 = 1, -10 % 3 = -1, 10 % -3 = 1)

3.2 赋值运算符

3.3 关系运算符

val s1 = "abc"
val s2 = "abc"
println(s1 == s2, s1.eq(s2))  //true, false

3.4 逻辑运算符

3.5 位运算符

原码,反码和补码

计算机底层存储,操作和运算数据都是采用数据的二进制补码形式实现

正数:原码,反码和补码都一样,不需要计算

负数:

   反码计算规则:原码的符号位不变,数值位按位取反

   补码计算规则:反码 + 1

第四章

4.1 流程控制结构

4.2 分支结构

1. scala没有三元表达式

2. scala条件表达式有返回值(java不行)

val sex = "male"
val result = if(sex == "male") 1 else 0
println(result)  //1

3. 块表达式

使用"{}"表示一个块表达式,它和条件表达式一样具有返回值,值为最后一个表达式

val a = {
       var b = "aaa"
       b + "11"
     }
print(a) //aaa11

4.3 循环结构

1. for循环

for(i <- 表达式/数组/集合) {
    //逻辑代码
}
var num = 1 to 10
for(i <- num) {
     println("num: " + i)
}
/**
num: 1
num: 2
num: 3
num: 4
num: 5
num: 6
num: 7
num: 8
num: 9
num: 10
*/
for(i <- 1 to 3; j <- 1 to 5) if(j == 5) println("*") else print("*")
/**
*****
*****
*****
*/

2. 守卫

for表达式中,可以添加if判断语句,这个if判断语句称为“守卫”,每一次遍历时都会经过if判断,如果为true,才会执行for大括号中的逻辑代码

for(i <- 表达式/数组/集合 if 表达式) {
    //逻辑代码
}
for(i <- 1 to 10 if i % 3 == 0){
    println(i)
}
//3 6 9

3. for推导式

在scala中,for循环是有返回值的,可以使用yield表达式构建处一个集合。使用yield的for表达式称为“推导式”。

val result = for(i <- 1 to 10) yield i *10
println(result) //(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

4. scala中没有break和continue

第五章

5.1 方法

1. 语法格式

def 方法名(参数名:参数类型, 参数名:参数类型) : [return type] = {方法体}

(1)参数列表的参数类型不能省略

(2)返回值类型可以省略

(3)返回值可以不写return,默认就是{}块表达式的值

2. 示例

获取两个数字中的最大值

def getMax(a:Int, b:Int):Int = if(a > b) a else b
println(getMax(3, 13)) //13

3. 返回值类型推断

如果定义的是递归方法,那么不能省略返回值类型

4. 惰性方法

当记录方法返回值的变量被声明为lazy时,方法的执行将被推迟,直到首次使用该值时,方法才会被执行,这种方法叫惰性方法。

java中没有提供惰性技术,但是可以通过懒加载来实现;

lazy不能修饰var类型的变量。

使用场景:

打开数据库连接

提升某些特定模块的启动时间

确保对象中的某些字段能优先初始化

def getTotal(a:Int, b:Int) = a + b
lazy val total = getTotal(1, 2) //这里方法不会被执行
println(total) //3, 这里才回值还行方法

5. 方法参数

(1)默认参数:在定义方法时,可以给参数定义一个默认值

def getSum(a:Int = 10, b:Int = 20) = a + b
println(getSum())       //30
println(getSum(50))     //70
println(getSum(b=50))   //60
println(getSum(50, 10)) //60

(2)带名参数

在调用方法时,指定参数名称来进行调用

(3)变长参数

如果方法的参数是不固定的,可以将该方法的参数定义成变长参数

def 方法名(参数名:参数类型*):返回值类型={方法体}

1)在参数后面加一个*,表示该参数可以是0个或多个

2)一个方法有且只有一个变长参数,并且要位于参数列表的最后

def getSum(numbers:Int*)=numbers.sum //numbers底层为数组,scala的数组可以直接求和
println(getSum(1, 2, 3, 4, 5)) //15

6. 方法调用方式

(1)后缀调用法

和java一样,语法如下:

对象名.方法名(参数)

示例:

Math.abs(-1)

(2)中缀调用法

语法格式:

对象名 方法名 参数

示例:

Math abs -1      //等同Math.abs(-1)
Math min(1, 2)   //等同Math.min(1, 2)
1 + 2            //等同 1.+(10)
1 to 10          //等同 1.to(10)

在scala中,操作符也是方法,例如+号是个方法名,是符号的方法

(3)花括号调用法(只能用于只有一个参数的方法)

语法格式:块表达式的返回值作为入参

Math.abs {
    //表达式
}

示例:

Math.abs{
  val a = -11
  if(a > 0) a else -10
} //10

(4)无括号调用法

如果方法没有参数,可以省略方法名后面的括号

示例:

def sayHello() = println("hello world")
sayHello //hello world

***过程

在scala中,如果方法的返回值类型是Unit,这样的方法称为过程(procedure),过程的"="号可以省略不写,例如:

(1)示例1
def sayHello() {println("hello world")}
sayHello //hello world

(2)示例2
def getMax(a:Int, b:Int) {
  val max = if(a >= b) a else b
  println("max value is: " + max)
}

getMax(1, 2) //max value is: 2

5.2 函数

1. 定义函数

val 函数变量名 = (参数名:参数类型, 参数名:参数类型...) => 函数体

1)在scala中,函数是一个对象

2)类似于方法,函数也有参数列表和返回值

3)函数定义不需要使用def

4)无需指定返回值类型

示例:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值