Scala函数式编程基础

Scala函数式编程基础

函数式编程介绍

  1. 在scala中,方法和函数几乎可以等同(比如它们的定义、使用、运行机制都一样的),只是函数的使用方式更加灵活
  2. 函数式编程是从编程方式的角度来谈的,可以理解为:函数式编程把函数当作一等公民,充分利用函数、支持函数的多种使用方式。
    比如:在Scala中,函数是一等公民,像变量一样,既可以作为函数的参数使用,也可以将函数赋值给一个变量,函数的创建不用依赖于类或者对象,而在java中,函数的创建则依赖于类,抽象类或者接口
  3. 面向对象编程是以对象为基础的编程方式
  4. 在scala中,函数式编程和面向对象编程融合在一起了

函数的定义

方法(需要通过对象调用):
def add(a: Int, b: Int): Int = { a+b } 最后一行执行代码即为返回值,在这里我们也可以不写返回值类型
(但是对于递归函数必须写出返回值类型)让编译器去自动判断
但是变量中类型是必须著名的,要不然再厉害的编译器也无法推断出来啊
方法转换成函数
add _ 输出:
(Int, Int) => Int =
(Int, Int):函数的参数列表
=>:函数的标识符
Int:函数的返回类型
function2:表示该函数有两个参数
函数(spark源码中有大量的函数)
函数一定有一个返回值的
定义一个匿名函数: (a: Int, b: Int) => {a+b}
val f1 = (a: Int, b: Int) => {执行逻辑}
val f2:(Int, Int) => Int = (a,b) => {a+b}
方法一:
val 函数名 = (函数的参数列表) => 函数体
方法二:
val 函数名 : (函数的参数类型列表) => 函数的返回值类型 = (函数的参数变量引用) => 函数体

函数-调用机制

def main(args: Array[String]): Unit = {
	val n1: Int = 1
	val n2: Int = 3
	val res = sum(n1, n2)
	println("res= " + res) //输出4
}
def sum(n1: Int, n2: Int): Int = n1 + n2

在这里插入图片描述

  1. 程序执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
  2. 函数的局部变量时独立的,不会相互影响
  3. 递归必须向退出递归的条件逼近,否则就时无限递归了
  4. 当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁

函数的参数

可变参数
java中String ... names 表示多个可变参数
scala中ints: Int* 表示多个可变参数

可变参数一般放在参数的末尾
def add2(initValue: Int, ints: Int* )

参数的默认值
def add(a: Int = 6, b: Int = 2)
add(b=6)
覆盖参数时,参数的名称必须和方法定义的名称保持一致

函数注意事项和细节讨论

1)函数的形参列表可以是多个,如果函数没有形参,调用时可以不带()
2)形参列表和返回值列表的数据类型可以是值类型和引用类型
3)scala中的函数可以根据函数体最后一行代码自行推断函数返回值类型。那么在这种情况下,return关键字可以省略

def sum(n1: Int, n2: Int): Int = n1 + n2

4)因为Scala可以自行推断类型,所以在省略return关键字的场合,返回值类型也可以省略

def sum(n1: Int, n2: Int) = n1 + n2

5)如果函数明确使用return关键字,那么函数返回就不能使用自行推断了,这时要明确写成 : 返回类型 = ,
6)如果函数明确声明无返回值(声明Unit),那么函数体中即使使用return关键字也不会有返回值
7)scala语法中任何的语法结构都可以嵌套其他语法结构(灵活),即:函数中可以再声明/定义函数,类中可以再声明类,方法中可以再声明/定义方法
8)在使用递归时,无法推断出结果类型,所以在定义时必须明确函数的返回值类型

posted @ 2019-02-19 16:00  刘丽刚  阅读(158)  评论(0)    收藏  举报