方法
方法是打包在某个名字下的小程序。在使用方法时,也就是调用方法时就会执行
这个小程序。方法将一组活动组合起来并赋予一个名字,这就是组织程序的最基本方式。
scala 中方法的基本形式为
def methodName(arg1:Type1, arg2:Type2, ...):returnType = {
lines of code
result
}
类和对象
scala 不仅仅是面向对象语言,还是函数式语言。在函数式语言中,我们会考虑动词,即
希望执行的动作,并且通常会将这些动作描述成数学上的等式。
对象包含存储数据用的 val 和 var 也就是域,并且使用方法来执行操作。
类定义了域和方法,它们使类在本质上就是用户定义的新数据类型。
构建某个类型的 val 或 var 称为创建对象或创建实例。
我们甚至将注入 Double 和 String 这样的内建类型的实例也称为对象
在 scala 中,使用 RPEL 可以很容易的对类进行探究,这使得他具有补全代码的好功能。
Scala Doc
在线 Scala Doc 地址 https://www.scala-lang.org/api/current/index.html
创建类
对象是针对待解决问题的解决方案的有机组成部分。我们先将对象当做表达概念的方式,
如果你发现了待解决问题的某样“事物”,那么就将其看作解决方案中的对象。
创建类需要以 class 开头,后面跟着为心类起的名字。类名必须以大写英文字母开头。
类中的方法
在类中可以定义属于这个类的方法。
在方法中创建的方法并未出现在类的定义内部,但是事实证明,在 Scala 中所有的事物都是对象。
当我们使用 RPEL或运行脚本时, Scala 会将所有不在类的内部的方法以不可视的方式打包到一个对象的内部。
导入和包
使用 import 的一种方式是指定类名。
import packagename.classname
可以在单个 import 语句中将多个类组合起来。
import util.{Random, Properties}
如果想导入某个包中所有的事物,可以使用下划线。
import util._
值函数
函数也是对象,也可以像变量一样被赋值,把这种函数称为函数字面量(function literal) 或值函数。
val sum =(x:Int, y:Int)=> { println(x+y) x+y }
上面定义了一个没有名字的函数,然后将其赋值给变量 val sum。
可以看到赋值时,如同一个普通的变量赋值一样
(x:Int, y:Int) 为值函数的输入参数, => 为函数映射符。
表示将 => 左边的某种类型转换后其右面的某种类型。
{ } 中放置的是函数体,如果只有一行语句,则可以省略
val sum=(x:Int, y:Int)=>x+y
上面的表达式称为 lambda 表达式,再上面的函数称为 Lambda 函数。
注意,值函数不能像普通函数那样指定其返回值类型,编译器会进行类型推导来确定函数返回值类型。
值函数的简化
值函数最常用的场景是作为高阶函数的输入
Array 的map 方法定义如下
- def map(f: (A) ⇒ B): Array[B]
该方法使用了泛型,泛型 B 指的是数组最终返回的元素类型, f 表示作用于数组各个元素上的函数,
(A) => B 为函数类型,表示的是函数的输入参数类型是 A, 返回值类型是 B
下面进行加速简化
val increment=(x:Int)=>x+1 arrInt.map(increment) increment: Int => Int = $$Lambda$4392/916115749@bfb1f0 res5: Array[Int] = Array(2, 3, 4, 5) // 如果值函数只使用一次,则常常直接作为函数参数 arrInt.map((x:Int)=>x+1) res6: Array[Int] = Array(2, 3, 4, 5) // 由于 arrInt 为整型数组,因此传入 map 的函数输入类型可以通过类型 // 推断得到,因此可以省略输入类型 arrInt.map((x)=>x+1) res7: Array[Int] = Array(2, 3, 4, 5) // 参数只有一个时可以将值函数输入参数的括号去掉 arrInt.map(x=>x+1) res8: Array[Int] = Array(2, 3, 4, 5) // 输入参数在 => 右边只出现一次,可以用占位符 _ 进一步简化 arrInt.map(_+1) res9: Array[Int] = Array(2, 3, 4, 5)
最后的代码之所以合法,是因为 arrInt 是 Int 类型的数组,可以进行类型推断。