慕课网实战·大数据探索(二):Scala语言基础(2)

14、函数类型与匿名函数

Sacla语言支持:
(1)把函数作为实参传递给另一个函数
(2)把函数作为返回值
(3)把函数赋值给变量
(4)把函数存储在数据结构里
在Scala中,函数就像普通变量一样,同样也具有函数的类型。函数类型的格式为:A => B,表示一个接受类型A的参数,并返回类型B的函数。

高阶函数:用函数作为形参或返回值的函数
例子:

def operate(f:(Int,Int)=> Int ){
	f(4,4)
}
def greeting() = (name : String)=> { "hello" +" " + name }

匿名函数(Anonymous Function)就是函数常量,也成为函数文字量
格式:(形参列表)=> {函数体}

15、柯里化

柯里化函数(Curried Function)把具有多个参数的函数转换为一条函数链,每个节点上是单一函数.
说明(下面两个函数等价):

def add(x:Int ,y:Int) = x  + y
def add(x:Int)(y:Int) = x + y

例子(对每个整型进行+1操作):

def curriedAdd(a:Int)(b:Int) = a + b
val addOne = curriedAdd(1)_ 		//柯里化构造新函数
addOne(2)

16、递归函数与尾递归

递归函数(Recursice Function)在函数式编程中是实现循环的一种技术
例子:计算n!

def factorial(n:Int):Int = 
	if(n <= 0)1
	else n * factorial(n - 1)

尾递归
尾递归函数(Tail Recursive Function)中所有递归形式的调用都出现在函数的末尾。
当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。
例子:计算n!

@annotation.tailrec		//不加这个,不进行尾递归优化
def factorial(n:Int,m:Int):Int = 
	if(n <= 0)m
	else fuctorial(n - 1,m * n)

factorial(5,1)

例子:计算Σ(a,b)f(x)

object sumfunc {
	def sum(f:Int => Int)(a:Int)(b:Int):Int = {
		@annotation.tailrec
 		def loop(n:Int,acc:Int):Int = {
			if(n>b){
				println(s"n=${n},acc=${acc}")
				acc
			}else{
				println(s"n=${n},acc=${acc}")
				loop(n+1,acc+f(n))
			}
		}
		loop(a,0)
	}

	def main(args: Array[String]): Unit = {
		sum(x=>x)(1)(5)		//(1)
		sum(x=>x*x)(1)(5)		//(2)
	}
}

运行结果:

(1)n=1,acc=0
	n=2,acc=1
	n=3,acc=3
	n=4,acc=6
	n=5,acc=10
	n=6,acc=15
(2)n=1,acc=0
	n=2,acc=1
	n=3,acc=5
	n=4,acc=14
	n=5,acc=30
	n=6,acc=55

柯里化优化:

val sumSquare = sum(x => x * x)_
sumSquare (1)(5)

执行结果与(2)结果相同

17、Collection集合

整体结构:
慕课网实战·大数据探索(二):Scala语言基础(2)_第1张图片

顶层父类:Traversable 遍历
直接子类:Iterable 迭代
三类集合:Set 、Seq(一组元素,有顺序的,顺序有意义)、Map

18、List

(1)定义:

scala> val a = List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)

(2)拼接获取List

scala> val b = 0 :: a
b: List[Int] = List(0, 1, 2, 3, 4)

(3)多重拼接

scala> val c = "x"::"y"::"z"::Nil
c: List[String] = List(x, y, z)		//整体运算过程从右至左(从List开始)

(4)双列表拼接

scala> a ::: c
res0: List[Any] = List(1, 2, 3, 4, x, y, z)

(5)访问第一个元素

scala> c.head
res1: String = x

(6)访问除第一个元素外的元素

scala> a.tail
res2: List[Int] = List(2, 3, 4)

(7)判断List是否为空

scala> a.isEmpty
res6: Boolean = false
scala> Nil.isEmpty
res7: Boolean = true

(8)List遍历

scala> def wailthru(l:List[Int]):String = {
     | if(l.isEmpty)""
     | else l.head.toString + "" + wailthru(l.tail)
     | }
wailthru: (l: List[Int])String

scala> var a = List(1,2,3)
a: List[String] = List(1, 2, 3)

scala>wailthru(a)
String = "1 2 3 "

你可能感兴趣的:(大数据,技术探索-慕课网实战-大数据)