[Scala]Scala学习笔记一 基础
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()
}
[Scala]Scala学习笔记一 基础的更多相关文章
- Scala入门学习笔记三--数组使用
前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...
- MyBatis:学习笔记(1)——基础知识
MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...
- bootstrap学习笔记之基础导航条 http://www.imooc.com/code/3111
基础导航条 在Bootstrap框中,导航条和导航从外观上差别不是太多,但在实际使用中导航条要比导航复杂得多.我们先来看导航条中最基础的一个--基础导航条. 使用方法: 在制作一个基础导航条时,主要分 ...
- Django学习笔记(基础篇)
Django学习笔记(基础篇):http://www.cnblogs.com/wupeiqi/articles/5237704.html
- C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)
一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...
- C#学习笔记(基础知识回顾)之值传递和引用传递
一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...
- C#学习笔记(基础知识回顾)之值类型和引用类型
一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...
- MAVEN学习笔记之基础(1)
MAVEN学习笔记之基础(1) 0.0 maven文件结构 pom.xml src main java package resource test java package resource targ ...
- mybatis学习笔记之基础复习(3)
mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己编写, 但是mybatis也是有映射(输 ...
- mybatis学习笔记之基础框架(2)
mybatis学习笔记之基础框架(2) mybatis是一个持久层的框架,是apache下的顶级项目. mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足s ...
随机推荐
- XMPP环境搭建 (mac环境下 安装自己独立的mysql与服务器(openfire),实现即时聊天功能)
1简单概览 [一]XMPP简介 http://xmpp.org 即时通讯技术 IM - Instant Messaging ⽀支持⽤用户在线实时交谈.交谈双⽅方都需要⼀一个聊天窗⼝口,其中⼀一个⽤用户 ...
- Nullable类型的问题处理
public class Calc { public long? Number { get; set; } public long Number1 { get; set; } public long ...
- 【Flask】Flask上下文
# 上下文: ### Local对象:在`Flask`中,类似于`request`的对象,其实是绑定到了一个`werkzeug.local.Local`对象上.这样,即使是同一个对象,那么在多个线程中 ...
- Python3.x:判断字符串是否为全数字、英文、大写、小写、空白字符
Python3.x:判断字符串是否为全数字.英文.大写.小写.空白字符 判断接字符串是否为数字: str = raw_input("please input the number:" ...
- apache php 60 503
服务器端:apache php 文件上传,60秒后,返回Response 503 php-fpm.conf: request_terminate_timeout = 600 前算万算没想到这里还有个超 ...
- vue切换路由模式{hash/history}
vue中常用的路由模式 hash(#):默认路由模式 histroy(/)切换路由模式 切换路由模式 export default new Router({ // 路由模式:hash(默认),hist ...
- [CF489D]Unbearable Controversy of Being
题目大意:求有向图中这种图的数量 从分层图来考虑,这是一个层数为3的图 枚举第一个点能到达的所有点,对他们进行BFS求第三层的点(假装它是BFS其实直接枚举效果一样) 代码: #include< ...
- AtCoder Regular Contest 097
AtCoder Regular Contest 097 C - K-th Substring 题意: 求一个长度小于等于5000的字符串的第K小子串,相同子串算一个. K<=5. 分析: 一眼看 ...
- eclipse设置控制台字体大小
步骤如下
- filebeat配置介绍
Filebeat Prospector filebeat.prospectors: - input_type: log paths: - /var/log/apache/httpd-*.log doc ...