Scala快速入门-2-控制结构与函数

简介: 表达式有值,语句执行动作。Scala中,几乎所有构造出来的语法结构都有值,不像Java中把表达式和语句(if语句)分为两类。在这里if表示式有值。代码块也有值,最后一个表达式就是值。语句中,分号不是必需的。函数式中不使用return。

背景


  • 表达式有值,语句执行动作。
  • Scala中,几乎所有构造出来的语法结构都有值,不像Java中把表达式和语句(if语句)分为两类。
  • 在这里if表示式有值。
  • 代码块也有值,最后一个表达式就是值。
  • 语句中,分号不是必需的。
  • 函数式中不使用return。

条件表达式


  • 在Scala中if/else表达式有值,这个值就是在if或else之后的表达式的值。
scala> var x = 10
x: Int = 10
scala> val r = if (x > 0) 1 else -1
r: Int = 1
scala> var x = 0
x: Int = 0
scala> val r = if (x > 0) 1 else -1
r: Int = -1
  • 可能if没有输出值,但在Scala中,每个表达式都有某种值。
scala> var x = 0
x: Int = 0
scala> val r = if (x > 0) 1
r: AnyVal = ()

块表达式和赋值


  • 在Scala中{}块包含一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值。
  • 对于某个val的初始化需要分多步完成的情况很实用。
  1. val dis ={val dx = x - x0; val dy = y - y0; sqrt(dx * dx + dy * dy)}

循环


  • while与Java中的循环一样。
while(n > 0) {
    r = r * n
    n -= 1
}
  • Scala没有for(初始化; 检查变量是否满足; 更新变量)的结构。
for(i <- 1 to n) {
    r = r * i
}
  • 1 to n 表达式表示:返回数据1到n(包含)的区间。
  • 1 until n 表达式表示:返回数据1到n(不包含)的区间。

增强for循环和for推导式


  • 可以以 变量<-表达式的形式提供多个生成器,用分号将他们隔开
scala> for(i <- 1 to 3; j <- 1 to 3) print ((10 * i + j) + " ")
11 12 13 21 22 23 31 32 33
  • 每个生成器都可以带一个守卫,以if开头的Boolean表达式 (if前并没有分号)
scala> for(i <- 1 to 3; j <- 1 to 3 if i != j) print((10 * i + j) + " ")
12 13 21 23 31 32
  • for推导式:for循环的循环以yield开始,则该循环会构造出一个集合,每次迭代生成集合中的一个值
scala> for(i <- 1 to 10) yield i % 3
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 0, 1, 2, 0, 1, 2, 0, 1)

函数


  • 函数定义:需要给出函数名、参数和函数体,格式如下
def abs(x: Double) = if (x >= 0) x else -x
  • 必须给出所有参数的类型
  • 递归函数必须指定返回值类型
def fac(n: Int) : Int = if(n <= 0) 1 else n * fac(n - 1)
  • 不需要 return语句
  • = 等号连接函数体
  • 默认参数和带名参数
scala> def decorate(str: String, left: String = "[", right: String = "]") = left + str + right
decorate: (str: String, left: String, right: String)String
scala> decorate("Hello World")
res3: String = [Hello World]
scala> decorate("Hello World", "<", ">")
res4: String = <Hello World>
  • 也可以在提供参数值时指定参数名,这样就可与函数定义参数列表的顺序不一致
scala> decorate(left = "<<", str = "Hello Scala", right = ">>")
res5: String = <<Hello Scala>>
  • 可以混用未命名参数和带名参数,只要未命名的参数排在前面即可
scala> decorate("Hello Spark", right = "]<<")
res6: String = [Hello Spark]<<
  1. 相当于

scala> decorate("Hello Spark", "[", "]<<")
  • 实现一个可以接受可变长参数列表的函数
scala> def sum(args: Int*) = {
     | var result = 0
     | for (arg <- args) result += arg
     | result
     | }
sum: (args: Int*)Int
scala> val s = sum(1, 3, 5, 7)
s: Int = 16
  • 可以使用 _*将一个整数区间转换成参数序列
  1. 直接使用会抛出如下错误:

scala> val ss = sum(1 to 5)
<console>:8: error: type mismatch;
 found   : scala.collection.immutable.Range.Inclusive
 required: Int
       val ss = sum(1 to 5)
// 正确的使用方式       
scala> val ss = sum(1 to 5: _*)
ss: Int = 15
  • 如果函数体包含在花括号当中,但没有前面的 =号,返回类型是Unit,这样的函数被称做过程。过程不返回值,调用它仅仅是为了它的副作用。
  • 当val被声明为lazy时,它的始始化将被推迟,直到首次对它取值。
lazy val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString
  1. 可以故意把文件名写错,试一下在初始化语句被执行的时候会不会报错(只有访问words时才提示文件未找到)


相关文章
|
6月前
|
分布式计算 Scala Spark
Scala【集合常用方法和函数操作(下)】
Scala【集合常用方法和函数操作(下)】
|
6月前
|
分布式计算 Scala Spark
Scala 【集合常用方法和函数操作-上】
Scala 【集合常用方法和函数操作-上】
|
6月前
|
编译器 Scala
认识scala中的函数
认识scala中的函数
55 5
|
5月前
|
Java 大数据 Scala
Scala快速入门--Scala环境搭建【Windows10】图解
Scala快速入门--Scala环境搭建【Windows10】图解
68 0
|
6月前
|
Scala
Scala函数和方法
Scala函数和方法
38 1
|
机器学习/深度学习 分布式计算 Java
Scala方法和函数
Scala方法和函数
101 0
|
消息中间件 Java 大数据
Scala快速入门
Scala快速入门
104 0
|
大数据 Serverless Scala
大数据开发基础的编程语言的Scala的函数和闭包
Scala是一种支持函数式编程的编程语言,它具有强大的函数和闭包功能。本文将介绍Scala中函数和闭包的概念和用法,帮助开发者更好地理解和应用这门语言。
86 0
Scala快速入门-11-常用集合操作
所有的集合都扩展自Iterable特质 集合有三大类,分别为序列、集和映射 几乎所有集合类,Scala都同时提供了可变和不可变的版本 Scala列表要么是空的,要么拥有一头一尾,其中尾部本身又是一个表列 集是无先后次序的集合 用LinkedHashSet来保留插入顺序,或用SortedSet来按顺序进行迭代 +将元素添加到无先后次序的集合中;+:和:+向前或向后追加到序列;++将两个集合串接在一起;-和--移除元素 映射、折叠和拉链操作是很有用的技巧,用来将函数和操作应用到集合中的元素
|
安全 Java 编译器
Scala快速入门-10-模式匹配与样例类
mathch表达式是一个更好的switch,不会有穿透到下一个分支的问题 如果没有模式能够匹配,会抛出MatchError,可以用case _ 模式来避免,相当于Java中的default 模式可以包含一个随意定义的条件,称做守卫 可以匹配数组、列表、元组等模式,然后将匹配到不同部分绑定到变量 样例类及密封类的模式匹配 用Option来存放可能存在也可能不存在的值,比null更安全