关闭

[Scala]Scala学习笔记一 基础

标签: Scala变量函数参数异常
271人阅读 评论(0) 收藏 举报
分类:

1. 变量

val定义的值实际上是一个常亮,无法改变其内容


scala> val num = 0
num: Int = 0

scala> num = 2
<console>:12: error: reassignment to val
       num = 2
           ^

如果要声明其值可变的变量,可以使用var

scala> var number = 0
number: Int = 0

scala> number = 2
number: Int = 2

在Scala中,建议使用val,除非你真的需要改变它的内容.

备注

不需要给出值或者变量的类型,可以从你用来初始化它的表达式推断出来.只声明值或者变量但不做初始化会报错:

scala> val str: String
<console>:11: error: only classes can have declared but undefined members
       val str: String
           ^

scala> val str: String = "Hello"
str: String = Hello

2. 常用类型

常用类型:

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

跟Java不同的是,这些类型是类.Scala并不刻意区分基本类型和引用类型.你可以对数字执行方法:

scala> 1.toString()
res2: String = 1

3. 条件表达式

Scala的if/else的语法结构和Java的一样.不过,在Scala中if/else表达式有值,这个值就是跟在if或else之后的表达式的值:

if(x > 0) 1 else -1

上述表达式的值是1或者-1,具体是哪一个取决于x的值.你可以将if/else表达式的值赋值给变量:

val s = if(x > 0) 1 else -1

等同于:

if(x > 0) s = 1 else s = -1

相对于第二种写法,第一种写法更好一些,因为它可以用来初始化一个val,而第二种写法当中,s必须是var.

备注

Scala中每个表达式都有一个类型

scala> val s = if(x > 0) "positive" else -1;
s: Any = positive

上述表达式的类型是两个分支类型的公共超类型.在这个例子中,其中一个分支是java.lang.String,而另一个分支是Int.它们的公共超类型是Any

if(x > 0) 1

那么有可能if语句没有输出值.但是在Scala中,每个表达式都应该有某种值.这个问题的解决方案是引入一个Unit类,写作().不带else的这个if语句等同于:

if(x > 0) 1 else ()

4. 循环

Scala拥有与Java和C++相同的while和do循环:

while(n > 2){
  println("num->" + n)
  n = n -1
}

但是Scala没有与for(初始化变量;检查变量是否满足某条件;更新变量)循环直接对应的结构.如果你需要这样的循环,有两个选择:一是选择while循环,二是使用如下for语句:

for(i <- 1 to n){
  println("num->" + i)
}

上述表达式的目标是让变量i遍历<-右边的表达式的所有值.至于如何遍历,则取决于表达式的类型.

遍历字符串或者数组时,你通常需要使用从0到n-1的区间.这个时候你可以使用util方法而不是to方法.util方法返回一个并不包含上限的区间:

val s = "Hello"
for(i <- 0 until s.length){
  println(i + " = " + s(i))
}

或者

for(ch <- "Hello"){
  println(ch)
}

5. 函数

要定义函数,需要给出函数的名称,参数和函数体:

def abs (x: Double) = if (x >= 0) x else -x

必须给出所有参数的类型,只要函数不是递归的,就可以不需要指定返回类型.Scala编译器可以通过=符号右侧的表达式的类型推断出返回类型. 如果函数体需要多个表达式完成,可以使用代码块.块中最后一个表达式的值就是函数的返回值:

def fac(n: Int) = {
  var r = 1
  for(i <- 1 to n){
    r = r * i
  }
  r
}

上例中函数返回值为r的值

备注

虽然在函数中使用return并没有什么不对,我们还是最好适应没有return的日子.之后,我们会使用大量的匿名函数,这些函数中return并不返回值给调用者.它跳出到包含它的函数中.我们可以把return当做是函数版的break语句,仅在需要时使用.

对于递归函数,我们必须指定返回类型:

def fac(n: Int) : Int = if(n < 0) 1 else n * fac(n-1)

6. 默认参数和带名参数

我们在调用某些函数时并不显示的给出所有参数值,对于这些函数我们可以使用默认参数:

def decorate (str : String, left : String = "[" , right : String = "]") {
  left + str + right
}

这个函数带有两个参数,left和right,带有默认值"["和"]"

decorate("Hello") // [Hello]
decorate("Hello", "<", ">") // <Hello>

你可以在提供参数值的时候指定参数名(带名参数):

decorate(left = "<<", str = "Hello", right = ">>") // <<Hello>>

你可以混用未命名参数和带名参数,只要那些未命名的参数是排在前面即可:

decorate("Hello", right = "]###") // 实际调用 decorate("Hello", "[", "]###")

备注

带名参数并不需要跟参数列表的顺序完全一致

7. 变长参数

可以实现一个接受可变长度参数列表的函数:

def sum(args : Int *) = {
  var result = 0
  for(arg <- args){
    result += arg
  }
  result
}

可以使用任意多的参数来调用该函数:

val result = sum(4, 5, 1) // 10

8. 过程

Scala对于不返回值的函数有特殊的表示法.如果函数体包含在花括号当中但没有前面的=符号,那么返回类型就是Unit,这样的函数被称为过程:

def welcome(str : String) {
  println("welcome " + str)
}

或者显示声明Unit返回类型:

def welcome(str : String) : Unit = {
  println("welcome " + str)
}

9. 懒值

当val被声明为lazy时,它的初始化将被推迟,直到我们首次对它取值:

lazy val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString

如果程序从不访问words,那么文件也不会被打开.

懒值对于开销较大的初始化语句而言十分有用.

备注

懒值并不是没有额外的开销.我们每次访问懒值,都会有一个方法被调用,而这个方法将会以线程安全的方式检查该值是否已被初始化.

10. 异常

Scala的异常工作机制跟Java一样.当你抛出异常时:

throw new IllegalArgumentException("x should not be negative")

当前的运算被终止,运行时系统查找可以接受IllegalArgumentException的异常处理器.控制权将在离抛出点最近的处理器中恢复.如果没有找到符合要求的异常处理器,则程序退出.

和Java一样,跑出的对象必须是java.lang.Throwable的子类.不过,与Java不同的是,Scala没有"受检"异常,你不需要声明函数或者方法可能会跑出某种异常.

throw表达式有特殊的类型Nothing.这在if/else表达式中很有用.如果一个分支的类型是Nothing,那么if/else表达式的类型就是另一个分支的类型:

if (x > 0) {
  sqrt(x)
}
else{
  throw new IllegalArgumentException("x should not be negative")
}

第一个分支的类型是Double,第二个分支的类型是Nothing,因此if/else表达式的类型是Double

捕获异常的语法采用的是模式匹配的语法:

try{
  process(new URL("Http://hortsman.com/fred-tiny.gif"))
}
catch {
  case _: MalformedURLException => println ("Bad URL:" + url)
  case ex: IOException => ex.printStackTrace()
}

与Java一样,更通用的异常应该排在更具体的异常之后.

try/finally 语句可以释放资源,不论有没有异常发生:

var in = new URL("").openStream()
try{
  process (in)
}
finally {
  in.close()
}
1
0
查看评论

Scala学习笔记1 - 基础

本文档针对scala 2.10.x,由于scala目前发展迅速,因此可能会和其他版本的不同。 ===概述          scala是一门以java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结...
  • guohecang
  • guohecang
  • 2016-08-04 11:47
  • 751

SCALA学习笔记(一)

变量 获取变量的值是一个耗时的工作时,可以考虑使用lazy var. lazy val forLater = someTimeConsumingOperation() scala> val first :: rest = List(1, 2, 3) first: Int = 1...
  • bluishglc
  • bluishglc
  • 2015-02-27 08:46
  • 23541

Scala的学习笔记_第一天

以一次接触Scala,记下的部分笔记,内容还会持续的更新,学习.
  • Abandon_Sun
  • Abandon_Sun
  • 2017-07-25 21:41
  • 209

Scala学习笔记(一)基础

Scala学习笔记(一)基础 scala类层次结构 与Java一样,Scala也有7种数值类型Byte、Char、Short、Int、Long、Float、Double,以及1个Boolean类型。与Java不同的是,这些类型是类,Scala并不可以区分基本类型和引用类型。
  • u011836581
  • u011836581
  • 2016-06-20 17:17
  • 62

Scala 基础入门教程

1.前言最近在参加Hadoop和Spark培训,需要使用Scala,自学了一下作为入门,这里作一个记录。2.下载1) 在scala官网下载,地址: http://www.scala-lang.org/2) 下载IDE,地址: http://scala-ide.org/3)配置环境...
  • afandaafandaafanda
  • afandaafandaafanda
  • 2016-03-16 16:14
  • 12028

Scala详解--------基础知识详解

Chapter1 1、Scala解释器 启动Scala解释器的方法如下: 自己总结的: 1.打开执行命令栏WIN+R  ,输入cmd,在命令行上输入Scala等待启动如下 如上面所示即可启动Scala 2.使用bin内部的启动脚本 ...
  • u011225629
  • u011225629
  • 2015-07-19 20:09
  • 1180

[scala--基础]--序列、集合、映射类型特点

性能特点 前面的解释明确说明了不同的容器类型具有不同的性能特点。这通常是选择容器类型的首要依据。以下的两张表格,总结了一些关于容器类型常用操作的性能特点。 序列类型的性能特点 head tail apply update prepen...
  • high2011
  • high2011
  • 2016-08-14 15:28
  • 756

[scala--基础]--类型匹配

一、由于scala是动静态结合语言,既可以面向对象编程,又可以面向函数编程。在运行时决定数据类型,所以经常在类型匹配中使用Some来匹配类型。如果不添加Some匹配,会导致结果不是我们想要的。 1、比如有Map集合: val strMap=("123"->&qu...
  • high2011
  • high2011
  • 2017-01-03 18:02
  • 484

Scala学习笔记之Scala基础

Scala基础 Scala中的每一个表达式都有一个值 变量声明 1.val不变量,var变量,建议使用val,申明不用加类型 2.加类型申明:val xmax,ymax:String = null val细节 val声明的变量仅仅不允许引用重新分配,而不阻止对象内部的变化 Uni...
  • ssjssh
  • ssjssh
  • 2013-09-28 12:34
  • 1583

Scala 学习笔记1(介绍)

1.   Scala有多cool “Put productivity & creativity back in the hands of developers”   1.1.     ...
  • zhangjianbo1989
  • zhangjianbo1989
  • 2014-09-02 09:17
  • 192
    个人资料
    • 访问:1517583次
    • 积分:22609
    • 等级:
    • 排名:第378名
    • 原创:624篇
    • 转载:133篇
    • 译文:60篇
    • 评论:189条
    博客专栏
    文章分类
    最新评论