简介
Scala将面向对象和函数式编程结合在一个简洁的高级语言中。 Scala的静态类型有助于避免复杂应用程序中的错误,其JVM和JavaScript运行时可让你构建高性能系统,轻松访问庞大的库生态系统
Scala的安装
官网下载scala:https://www.scala-lang.org/
Windows版本安装
- 双击安装,无脑下一步
- 配置环境变量
1
2
3SCALA_HOME=E:scala Path中追加 %SCALA_HOMEbin%
- cmd进入黑窗口输入scala,出现如下信息说明配置成功
1
2
3
4C:UsersAdministrator>scala Welcome to Scala 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_161). Type in expressions for evaluation. Or try :help.
Linux版本安装
1
2
3
4
5
6
7
8[root@CentOSA ~]# rpm -ivh scala-2.11.12.rpm Preparing... ########################################### [100%] 1:scala ########################################### [100%] [root@CentOSA ~]# scala Welcome to Scala 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_191). Type in expressions for evaluation. Or try :help. scala>
IDEA集成Scala开发
安装Scala插件,重启idea
变量
Scala语言中没有原始数据类型,这一点和Java语言不同,在Scala中一切且对象。以下是Scala语言中常见类型和类型间的继承关系。
在Java中常见的基本类型在Scala中都被剔除了,Scala将值类型和引用类型分离。所有的数值变量类型都是 AnyVal的子类,这些变量的值都有字面值。对于一些对象类型的变量都是 AnyRef的子类。对于 AnyRef类下的变量(除String类型),一般不允许直接赋值字面量,都需要借助 new关键创建。
变量声明
Scala语言是一种可以做类型自动推断的强类型的编程语言。变量的类型可通过编译器在编译的时候推断出最终类型。因此Scala中声明一个变量主需要告知编译器该变量的值是常量还是变量,例如:例如声明一个变量使用var即可,如果声明的是一个常量使用val关键字。因此Scala中变量声明的语法如下:var|val 变量名[:类型] = 变量值[:类型]
1
2
3
4
5var a:Int = 1:Int var b:Int = 1 var c = 1:Int var d = 1
Scala所有的变量在声明时可以省略类型,并不意味之Scala是一种弱类型的编程语言,程序一旦编译后,类型固定,不可以更改。
数值转换
以下是黑窗口命令结果
1
2
3
4
5
6
7
8
9
10
11
12
13scala> var i=1 i: Int = 1 scala> var b:Byte=i.asInstanceOf[Byte] b: Byte = 1 scala> var b:Byte=i.toByte() <console>:12: error: Byte does not take parameters var b:Byte=i.toByte() scala> var b:Byte=i.toByte b: Byte = 1
用户可以使用asInstanceOf[类型]这种方式在数值间转换。该方式只适合类型兼容的时候使用,如果类型不兼容可以使用toInt、toChar、…等可以将常规参数自动转换为数值类型。
1
2
3
4
5
6
7
8
9
10
11scala> var sex="true" sex: String = true scala> sex.toBoolean res2: Boolean = true scala> sex.asInstanceOf[Boolean] java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean at scala.runtime.BoxesRunTime.unboxToBoolean(BoxesRunTime.java:85) ... 32 elided
数组
声明一个int类型的数组:
1
2val array:Array[Int] = Array(1,2,3)
元组
元组是在Scala编程语言中的一种特殊变量,该变量可以组合任意几种类型的变量,构建一个只读的变量类型。访问元组的成员可以使用_元素下标访问。(一个元组最多有22个元素)
1
2
3
4
5
6
7//元组,只读 var t:(String,Int)=("zhanghaonan",18) print(t._1+t._2+"岁") var t = (1,1,1,1,1,1,"adsf",1) print(t._7)
分支循环
if
修饰的代码分支可以赋值给一个变量
1
2
3
4
5
6
7
8
9
10var i:Int=new Random().nextInt(30) var a = if (i<30){ "唵" }else if(i<60){ "哞" }else if(i<90){ "咪" } println(a)
Break
Scala 语言中默认是没有 break 语句,但是在 Scala 2.8 版本后可以使用另外一种方式来实现 break 语句。当在循环中使用 break 语句,在执行到该语句时,就会中断循环并执行循环体之后的代码块。Scala 中 break 的语法有点不大一样,格式如下:
1
2
3
4
5
6
7
8
9
10
11var loop=new Breaks loop.breakable({ do{ i -= 1 print(i+"t") if(i==1) { loop.break() } }while(i!=0) })
for循环
- 遍历数组
1
2
3
4
5var array = Array(1,2,3,4,5) for(i<-array){ println(i) }
1
2
3
4
5var array = Array("苦","海","翻","起","爱","恨") for(i<-0.to(array.length-1)){ print(array(i)) }
1
2
3
4
5var array=Array("a","b","c") for( index <- 0 until array.length){ print(array(index)+"t") }
- for循环可以使用多个循环因子
1
2
3
4
5
6//99乘法表 for(i<-1 to 9;j <- 1 to i){ print(s"$i*$j="+(i*j)+"t") if(i==j) println() }
- for循环嵌套if
1
2
3
4for(i<-1 to 9;if(i%2==0 || i%3==0) ){ print(s"$it") }
- 数组计算
1
2
3
4
5
6var array=0 to 9 val results = for(i <- array;if(i%2==0)) yield i*i for(i <- results){ println(i) }
模式匹配(类似Java中的switch-case)
模式匹配是检查某个值(value)是否匹配某一个模式的机制,一个成功的匹配同时会将匹配值解构为其组成部分。它是Java中的switch语句的升级版,同样可以用于替代一系列的 if/else 语句。
- 数值匹配
1
2
3
4
5
6
7
8
9
10
11val x: Int = Random.nextInt(10) var result= x match { case 0 => "zero" case 1 => "one" case 2 => "two" case 3 => "three" case 4 => "four" case _ => "other" } println(result)
- 类型匹配
1
2
3
4
5
6
7
8
9
10
11var array=Array("zs",true,new Date(),1000.0) var x=array(new Random().nextInt(array.length)) var result= x match { case v:String => "name" case v:Boolean => "sex" case x:Date => "birth" case x:Double => "salary" case _ => "未知" } println(result)
函数
- 标准函数
1
2
3
4
5
6
7
8
9def sum(x:Int,y:Int):Int={ return x+y } //可以省略返回值类型 def sum(x:Int,y:Int)={ x+y }
- 可变长参数
1
2
3
4
5
6
7def sum(args:Int*):Int={ var sum:Int=0 for(arg<-args){ sum+=arg } }
- 参数默认值
1
2
3
4def hello(msg:String="hey",name:String="xiaoming"):Unit={ print(msg+","+name) }
- 内嵌函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19def factorial(x:Int)={ def mulit(i:Int):Int={ if(i > 0){ i*mulit(i-1) }else{ 1 } } mulit(x) } 等价 def factorial(x:Int):Int={ if(x>0){ x*factorial(x-1) }else{ 1 } }
- 柯里化(Currying)
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数的新函数的这种技术。
1
2
3
4
5
6
7
8
9
10
11def sum1 (x:Int,y:Int):Int={x+y} //sum1变成下面的形式 def add(x: Int)(y: Int): Int = { x + y } var result = add(1)(_) //下划线“_” 作为第二参数列表的占位符, 这个定义的返回值为一个函数,当调用时会给调用的参数加一 print(result(2)) //结果为3,在应用时应该使用这种形式:sum(1)(2)
add(1)(2) 实际上是依次调用两个普通函数(非柯里化函数),第一次调用使用一个参数 x,返回一个函数类型的值,第二次使用参数y调用这个函数类型的值。
匿名函数
Scala中,函数可以没有命名,此时函数被称为匿名函数。
可以直接定义匿名函数之后,将函数赋值给某个变量;也可以直接将定义的匿名函数传入其他函数中。
Scala 中定义匿名函数的语法:(参数名:参数类型)=>函数体
1
2
3var f:(Int,Int)=>Int = (x:Int,y:Int)=>{x*y} print(f(4,5))
1
2
3
4
5def a(x: Int, y: Int)(b: (Int, Int) => Int): Int = { b(x, y) } print(a(1,2)((i:Int,j:Int)=>i+j))
高阶函数的类型推断
高阶函数可以自动推断出参数类型,而不需要写明类型;而且对于只有一个参数的函数,还可以省去其小括号;如果仅有一个参数在右侧的函数体内只使用一次,则还可以将接收参数省略,并且可以参数用_来替代。
函数和变量
- 定义一个是变量的函数
1
2var f:(Int,Int)=>Int = (x:Int,y:Int)=>Int
- 声明一个函数
1
2sum:(Int,In)=>Int = (x,y)=>{x+y}
最后
以上就是爱笑蛋挞最近收集整理的关于Scala基础和函数的全部内容,更多相关Scala基础和函数内容请搜索靠谱客的其他文章。
发表评论 取消回复