前一段时间在知乎上看到有人在讨论Scala,感觉这门语言还挺有意思的,最近正好不是很忙,找了些时间看了一下,这里记录一下学到的东西吧。
Scala是一门JVM上的FP+OO的语言,FP是函数式编程,与之对应的是命令式编程如JAVA,函数式编程有几个特点:
- 函数是一等公民,函数可以作为参数,返回值。
- 强调不变性,不是变量是表达式
- 函数没有副作用,不依赖外部状态,也不会改变外部的状态,给定相同的输入,都会有同样的输出
Scala的语法与JAVA有些相似,但是又有很大的区别,首先是变量的定义:
var one : Int = 1
val two : Int = 2
类型放在变量名的后面,用:隔开,var 是可从新赋值的变量,而val是不可重新赋值的,例如Java中的final 修饰的变量。同时类型可以省略,编译器可以自动推断出类型
var three = 3
函数定义
Scala 里函数的定义:
def max(a:Int,b:Int) :Int = {
if (a>b) a else b
}
我们可以看到函数的定义是用def 关键字,返回类型跟在括号后面。同时与Java不一样的是,函数的定义与变量一样需要用等号来连接。
如果你的函数体只有一个语句,可以把花括号去掉
def max(a:Int,b:Int) :Int= if (a>b) a else b
同时,我们可以省略返回类型,编译器可以自动推测
def max(a:Int,b:Int)= if (a>b) a else b
上面说过,Scala是支持函数式编程的,函数可以当作参数和返回值,我们来定义一个参数是函数的函数
def calculate(f:Int=>Int,a:Int):Int = f(a)
我们定义了一个函数calculate,它有两个参数,f 和 a ,f的类型是Int=>Int ,表示这是一个函数类型,这个函数的参数是Int类型,返回值也是Int类型。我们来用一下这个函数:
def sumOne(a:Int):Int=a+1
val result=calculate(sumOne,1)
看一下结果
Java要实现相同的方式就需要匿名类了,Scala确实要简洁许多。设计模式里面的策略模式好像就是这个思想,只不过复杂化了。
Scala集合
Scala的集合主要有 List Set Map Tuple。
除了Tuple 其他的Java里面都有,Tuple翻译成元组,它跟List很像,不过它里面可以放各种类型的元素,而List只能放相同类型的。
val ones=("1",1,1.0)
我们可以用->符号快速的构造两个元素的元组
val pair = 1->"1"
Scala 里面集合分为两种,可变集合和不可变集合,函数式编程崇尚不可变,Scala鼓励使用不可变集合,但是也不限制你使用可变集合。Scala里默认的是不可变集合:
var lista=List(1,2,3)
var listb=4::lista
lista
首先创建了一个lista,里面有1,2,3然后我们用 :: 这个符号把4加到list里面,因为List是不可变的,所以scala新建了一个List返回给了listb,所以看到lista还是1,2,3。