Scala学习笔记

来源:互联网 发布:重庆高档小区知乎 编辑:程序博客网 时间:2024/05/18 17:42

第2章 控制结构和函数a1 13

 

2.1  条件表达式14

scala 的if else是有返回值的

1、val a = if(x > 0) x else -1 返回类型是个Int

2、val b = if(x > 0) x else "minus" 返回类型是Any(因为数据类型的公共父类都是Any)

3、 val c = if (a > 1) a 返回类型是AnyVal,虽然这里没有else,但是scala会引入Unit所以该表达式同等于

val c = if (a > 1) a else () () = 无用值

 

 

2.2 语句终止 16

一般一行想要写多个语句的时候会用到分号

默认情况下scala是不用写分号

 

 

2.3 块表达式和赋值 16

块 => {}

在scala中{}包含一系列表达式,其结果就是块中最后一个表达式的返回值

 

 

2.4  输入和输出17

println("")

println("%s,%d","a",b)

println(s"${},${}")

 

 

2.5 循环 18

其他循环类似,只有for有点区别

 

让变量i遍历<-右边的表达式的所有值

for(i <- 表达式){

}

 

scala没有提供break continue这些跳出等操作

其实for中还有很多高级用法,文中只件了这么点

 

 

2.6 高级for循环和for推导式19

多重循环

for(i <- 1 to 3; j<- 1 to 3) print((10 * i * j) + " ")

scala> for(i <- 1 to 3; j<- 1 to 3) println(i,j)

(1,1)

(1,2)

(1,3)

(2,1)

(2,2)

(2,3)

(3,1)

(3,2)

(3,3)

 

推导式

val a = (i <i 1 to 10) yield i % 3

 

 

2.7 函数 21

scala支持方法和函数

方法对对象操作,函数不是

但是文中没有详细说明,方法与函数的区别

 

 

2.8 默认参数和带名参数 l1 22

调用方法时,可以使用方法的默认值,也可以在调用时显式声明赋值

def cxsum(i:Int,j:Int = 2) = i + j

cxsum(1)

or

cxsum(1,2)

or

cxsum(1,j=3)

 

 

2.9 变长参数 l122

一个方法可以接收多个同类型的参数

 

def aaa(i:Int*) = i.map(_*2)

println(aaa(2,4))

入参scala会给予 Seq(Int)的类型,返回值是个ArrayBuffer

 

 

2.10 过程 23

如果函数体包含在花括号当中,且没有=号,返回类型就是Unit,这样的函数叫过程

过程没有返回值,我们调用它仅仅是为了它的副作用

def speak(s:String){ println(s) } 隐式

def speak(s:String):Unit { println(s) } 显式

 

 

2.11 懒值l1 24

延迟计算

2.12 异常 25

讲得太浅,可以先参考java的

 

 

练习

1.if else版,模式匹配版

def zf(n: Int) = {

if (n > 0) {

1

} else if (n == 0) {

0

} else {

-1

}

}

 

def zf2(n:Int) = n match {

case `n` if `n` > 0 => 1

case 0 => 0

case _ => -1

}

 

找出整型,如果大于0就返回1,等于0就返回0,小于0就返回-1

BigInt(1).signum

 

 

2.val a = {}

a = Unit

 

4.List(0 to 10: _*).reverse.foreach(println)

for(i <- 0 to 10 reverse) println(i)

 

5.写个过程,打印n到0

def countdown(n: Int){

List(0 to n: _*).reverse.foreach(println)

}

 

6.循环版

var t:Long = 1

for(i <- "Hello") t = t * i.toLong

println(t)

 

7.不用循环版

"Hello".map(_.toLong).product

 

 

8.

def pro(s: String): Long = {

s.map(_.toLong).product

}

 

 

9.

defproduct1(s:String):Long={

if(s.length ==1)

s.charAt(0).toLong

else

s.take(1).charAt(0).toLong * product1(s.drop(1))

}

 

defproduct2(s:Array[Char]):Long={

if(s.length ==1)

s(0).toLong

else

s(0).toLong * product2(s.drop(1))

}