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会自动补全类型。

如:

函数定义也是,如果不指定返回值类型,也会默认

显示定义返回类型:

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)的基类

函数

函数是一等公民

scala入门

代码块 {}

如果是多行,请使用{}

{

exp1

exp2

}

返回值即为exp2

A => B匿名函数

什么是高阶函数?

scala入门


if语句

if表达式,使用方法和java一样的

scala入门

这个什么也没返回,所以是空Any


for

Scala 语言中 for 循环的语法:

for( var x <- Range ){
   statement(s);}
for( a <- 1 to 10){
         println( "Value of a: " + a );
      }

其中1 to 10返回的是Range

scala入门

也可以加step


try catch

scala入门


其中_是通配符,它可以匹配任意类型。


求值策略

scala入门

区别是:

call by value值会立即算出,call by name先引用名后计算

scala入门

scala柯里化

scala入门

这样做的好处是:

比如:

scala入门

对同一个函数,不同传参形式的处理


递归与尾递归

我们知道递归调用会有内存溢出的危险,而且比较占内存,所以我们优化它,建议使用尾递归

scala入门

如果使用尾递归

scala入门

它把每一步的值暂存到m,并作为参数执行下一轮循环,这样之前的递归就可以覆盖掉

scala入门



Map

// 定义 Mapval 
x
= Map("one" -> 1, "two" -> 2, "three" -> 3)

// 创建两个不同类型元素的元组
val x = (10, "Runoob")

获取map,x("one")

获取元组第一个值,x._1


定义list

scala入门

::是从右往左连接,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入门的主要内容,如果未能解决你的问题,请参考以下文章

Scala的符号入门

Scala入门

Scala快速入门

Scala基础入门,纯干货!

scala基本入门

scala入门笔记