scala入门
Posted 山西软件小课堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scala入门相关的知识,希望对你有一定的参考价值。
Scala 是 Scalable Language 的简写,是一门多范式的编程语言.
Scala 特性
面向对象特性
函数式编程
纯函数:没有副作用的函数。副作用就是状态的变化(mutation)。
比如:
val x = 1;
def fn1(y: Int) x+y
def fn2(y: Int) x+y; x
fn1对x不具有副作用,所以fn1是纯函数,fn2就不是。
函数是一等公民:即函数和变量使用一个,函数可以作为参数,也可以作为返回值,可以赋值给一个变量。
函数的求值
惰性求值:即值不会立即返回,而是使用时才会返回。
scala和java可以相互操作,你可以在scala的项目里引用jar包,也可以在java项目里写scala文件
函数式编程的优点:
效率高:编写效率高,只用别的语言的一小半篇幅即可完成
并行编程、多核计算:相较于Java\c执行效率高。现在已步入多核模型,函数式编程非常适合于多核计算。
Scala 搭建
scala依赖于jvm,所以先下载jdk,然后下载scala,都从官网上找,然后一路回车即可。
sbt下载,它是scala的构建工具。
ide的话,你可以用eclipse或者intel idea都行。
在命令行中,输入sbt console即进入命令行模式,
不过这个一次只能输入一行,如果想多行输入,再输入:paste即可,输入完后ctrl + d,退出编辑。
Scala 第一个例子
我们也可以通过创建一个 HelloWorld.scala 的文件来执行代码,HelloWorld.scala 代码如下所示:
object HelloWorld { /* 这是我的第一个 Scala 程序 * 以下程序将输出'Hello World!' */ def main(args: Array[String]) { println("Hello, world!") // 输出 Hello World }}
接下来我们使用 scalac 命令编译它:
$ scalac HelloWorld.scala $ lsHelloWorld$.class HelloWorld.scalaHelloWorld.class
编译后我们可以看到目录下生成了 HelloWorld.class 文件,该文件可以在Java Virtual Machine (JVM)上运行。
编译后,我们可以使用以下命令来执行程序:
$ scala HelloWorldHello, world!
Scala 数据类型
当你不定义类型时,scala会自动补全类型。
如:
函数定义也是,如果不指定返回值类型,也会默认
显示定义返回类型:
不定义返回类型:
定义一个常量,即不会变化的,用val,定义变量用var,定义函数用def
变量类型:
数据类型 | 描述 |
---|---|
Byte | 8位有符号补码整数。数值区间为 -128 到 127 |
Short | 16位有符号补码整数。数值区间为 -32768 到 32767 |
Int | 32位有符号补码整数。数值区间为 -2147483648 到 2147483647 |
Long | 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 |
Float | 32位IEEE754单精度浮点数 |
Double | 64位IEEE754单精度浮点数 |
Char | 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF |
String | 字符序列 |
Boolean | true或false |
Unit | 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。 |
Null | null 或空引用 |
Nothing | Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。 |
Any | Any是所有其他类的超类 |
AnyRef | AnyRef类是Scala里所有引用类(reference class)的基类 |
函数
函数是一等公民
代码块 {}
如果是多行,请使用{}
{
exp1
exp2
}
返回值即为exp2
A => B匿名函数
什么是高阶函数?
if语句
if表达式,使用方法和java一样的
这个什么也没返回,所以是空Any
for
Scala 语言中 for 循环的语法:
for( var x <- Range ){ statement(s);}
for( a <- 1 to 10){ println( "Value of a: " + a ); }
其中1 to 10返回的是Range
也可以加step
try catch
其中_是通配符,它可以匹配任意类型。
求值策略
区别是:
call by value值会立即算出,call by name先引用名后计算
scala柯里化
这样做的好处是:
比如:
对同一个函数,不同传参形式的处理
递归与尾递归
我们知道递归调用会有内存溢出的危险,而且比较占内存,所以我们优化它,建议使用尾递归
如果使用尾递归
它把每一步的值暂存到m,并作为参数执行下一轮循环,这样之前的递归就可以覆盖掉
Map
// 定义 Mapval
x = Map("one" -> 1, "two" -> 2, "three" -> 3)
// 创建两个不同类型元素的元组
val x = (10, "Runoob")
获取map,x("one")
获取元组第一个值,x._1
定义list
::是从右往左连接,Nil是空
拼接list
a.head 1
a.tail 除head之外的其它值 List(2,3)
应用--- 快速排序
def qSort(x: List[Int]):List[Int] = { if (x.length<=1) x else qSort(x.filter(_ < x.head)) ++ x.filter(_ == x.head) ++ qSort(x.filter(_ > x.head))
}
是不是非常简洁高效?
以上是关于scala入门的主要内容,如果未能解决你的问题,请参考以下文章