面向函数编程
Scala入门 基本概念
上页我们了解了函数在Scala中重要作用,以及常用的map和flatmap用法,这章进入Scala其他特点介绍:
- Type Inference类型推断
- Immutability不变性
- Arrays,Collections and Tuples数组,集合和元组
- Loops and Expressions循环和表达式
- Functions函数
- Classes and Companion Object类和对象伴侣
Type Inference类型推断
当你声明的任何变量时,你不需要指定类型。让我们来看看下面的例子。打开REPL下输入
val number1:Int =5
结果是number1: Int = 5
val number2=5
结果是number2: Int = 5
在上面的例子在第一种情况下,我们声明的变量number1它的类型为INT(冒号后), 在第二种情况下,我们没有指定类型,Scala推断的它作为Int。 此外,在Scala中你不需要在语句尾部指定分号;
Immutability不变性
Scala语言是不变性优先,这与函数式编程的原则一致。所以,如果你不指定任何修饰符,默认情况下VAL将被使用。如果您使用var时,表示变量的值是可以改变的。
数组
数组的写法如下:
val names = Array("John","Ron","Tom")
或
val numbers = Array(1,2,3)
为访问数组中元素,直接定义索引index就可以:
scala> numbers(1)
res0: Int = 2
mkString方法可以串连数组或集合的元素:
集合
Scala 支持可变和不可变集合。默认值是不可改变的,下面是集合结构:
Set
缺省你创建的Set是不可变的,如果你要创建可变的,使用导入scala.collection.mutable.Set.
上面当我们对不可变的集合增加一个元素 citySet+="SFO"时,出错。只要使用可变集合才通过。
Map
此Map非前面函数map,两者意思不同,这里是数据结构,类似Java的Map,Map也和Set类似,缺省是不可变的,可变需要导入可变的Map
scala> val cityMap = Map(1->"Mum",2->"NY",3->"LA")
cityMap: scala.collection.immutable.Map[Int,String] = Map(1 -> Mum, 2 -> NY, 3 -> LA)
scala> cityMap += (4->"SFO")
:10: error: value += is not a member of scala.collection.immutable.Map[Int,String]
cityMap += (4->"SFO")
^
scala> import scala.collection.mutable.Map
import scala.collection.mutable.Map
scala> val cityMap2 = Map(1->"Mum",2->"NY",3->"LA")
cityMap2: scala.collection.mutable.Map[Int,String] = Map(2 -> NY, 1 -> Mum, 3 -> LA)
scala> cityMap2 +=(4->"SFO")
res6: cityMap2.type = Map(2 -> NY, 4 -> SFO, 1 -> Mum, 3 -> LA)
|
List
如果List声明为不可变,你也不能增加元素:
元tuples
当你从函数返回多个值/类型时,使用元组。下面元组包含整数型和字符串两种类型。
循环和表达式
在Scala中的每个声明结果statement可以是一个表达式expression(任何声明返回的值被认为是一个表达式)。
if / else表达式的结果分配给finalNum。这是非常相似的三元运算符在Java中
for循环:
上面的for循环有副作用。没有副作用的表现应该在一个循环返回一些值,以便以后能够使用,也就是要有输出,否则如果在这个for中对集合元素进行了修改,后面的代码是不会发现的,这带来了副作用。那么使用yeild来返回值
最好的办法是用map来替代。
函数
定义一个函数如下:
说明:
- 函数的定义用def关键字
- 参数以及它们的类型一起指定(类型在名称后面)
- 返回参数也需要指定函数类型。在上述情况下,它是Int
- 函数详细定义是等号(=)后面的指定大括号内
上面的精简版如下,更显得地道:
类和对象伴侣
Scala没有静态static概念。不过它有一个伴侣对象 Companion objec。一个同伴对象具有相同的名称作为类名。你可以直接调用它们的方法,而无需创建实例。