一、声明函数

  • 函数其实是一段具有特定功能的代码的集合,由函数修饰符、函数名、函数参数列表、函数返回值声明与函数体组成。

(一)显式声明函数

1、声明格式

[public | private | protected] def 函数名(参数列表) : 返回值声明 = {函数体}

2、注意事项

  • 函数通过def关键字定义
  • def前面可以具有修饰符,可以通过private、protected来控制其访问权限。注意默认访问权限是public
  • 还可使用override、final等关键字修饰
  • 函数体中return关键字往往可以省略掉,一旦省略掉,函数将会返回整个函数体中最后一行表达式的值,这也要求整个函数体的最后一行必须是正确类型的值的表达式
  • scala一般都可以自动推断出返回值类型,所以通常返回值类型声明可以省略,但是注意,如果因为省略了返回值类型造成歧义,则一定要写上返回值声明
  • 如果函数体只有一行内容,则包裹函数体的大括号可以省略
  • 如果返回值类型是Unit,则另一种写法是可以去掉返回值类型和等号,把方法体写在花括号内,而这时方法内无论返回什么,返回值都是Unit

3、案例演示

(1)加法函数

  • 创建net.huawei.day08包,在包里创建Example01对象

spark contains函数用法 spark函数教程_scala

运行结果

spark contains函数用法 spark函数教程_spark_02

(2)阶乘函数

  • 显式声明阶乘函数并调用,在net.huawei.day08包里创建Example02对象

spark contains函数用法 spark函数教程_开发语言_03

运行代码,查看结果

spark contains函数用法 spark函数教程_spark contains函数用法_04

(二)隐式声明函数

1、声明格式

(参数列表) => {函数体}

2、注意事项

  • 如果函数体只有一行,那么大括号可以省略
  • 如果参数类型可以推测得知,那么参数列表中类型声明可以省略
  • 如果函数参数列表中只有一个参数,在不会产生歧义的情况下,小括号可以省略

3、案例演示

(1)加法函数

  • net.huawei.day08包里创建Example03对象

spark contains函数用法 spark函数教程_scala_05

运行代码,查看结果

spark contains函数用法 spark函数教程_spark_06

(2)三整数加法函数和阶乘函数

  • 隐式声明三整数相加函数和阶乘函数

spark contains函数用法 spark函数教程_函数体_07

  • 有些算子要用函数作为参数,我们经常会用匿名函数作为参数

(3)打印直角三角形

  • 方法一、采用传统的双重循环实现

spark contains函数用法 spark函数教程_开发语言_08

  • 方法二、采用单重循环配上流间变量来实现

spark contains函数用法 spark函数教程_函数体_09

  •  方法三、采用映射算子(map())和遍历算子(foreach())来实现

spark contains函数用法 spark函数教程_函数体_10

  •  其中,map()算子传入的是一个隐式函数,foreach()算子传入的是一个显式函数(系统提供的函数)

(4)计算1 + 2 + 3 + …… + 100的值

  • 不采用循环,而采用归约算子(reduce())算子来完成,归约算子传入一个匿名函数_ + _或(x, y) => x + y

spark contains函数用法 spark函数教程_spark_11

二、Scala函数种类

(一)成员方法

1、基本概念

  • 函数被使用在类的内部,作为类的一个成员,称为类的成员方法。

2、案例演示

任务:显示文件中长度超过15的行

  • 在项目根目录里创建文本文件text.txt

spark contains函数用法 spark函数教程_开发语言_12

  • net.huawei.day08包里创建Example04对象 

spark contains函数用法 spark函数教程_函数体_13

 运行代码,查看结果

spark contains函数用法 spark函数教程_spark_14

package net.zyf.day08

import scala.io.Source

/**
 * 功能:
 * 作者:zyf
 * 时间:2023年03月00号
 */
object Example04 {
  def filter(line: String, len: Int): Boolean = {
    line.length > len
  }

  def getLinesFromFile(path: String, len: Int) = {
    val lines = Source.fromFile(path).getLines()
    for (line <- lines if filter(line, len)) yield line
  }

  def main(args: Array[String]): Unit = {
    val lines = getLinesFromFile("text.txt", 15)
    for (line <- lines) println(line + " " + line.length)
  }
}

(二)局部函数

1、基本概念

  • 函数内嵌的函数称为局部函数,这样的函数,只能在外部函数内部使用,外界无法访问。注意,Java是不允许函数嵌套的,但是Scala是允许的。

2、案例演示

任务:采用局部函数显示文件中长度超过15的行

  • net.huawei.day08包里创建Example05对象

spark contains函数用法 spark函数教程_spark_15

运行程序,查看结果

spark contains函数用法 spark函数教程_spark_16

(三)匿名函数

1、基本概念

  • 函数在Scala中是头等公民,这体现在函数可以任意赋值给变量或常量,甚至可当作方法的实参或当作方法的返回值。在Java中只有变量或常量才能这么去使用。将函数直接量赋值给一个常量或变量,得到就是一个函数值,在需要时可以通过这个函数值来调用方法本身。

2、案例演示

任务:将函数赋值给常量

  • net.huawei.day08包里创建Example06对象

spark contains函数用法 spark函数教程_spark contains函数用法_17

 运行代码,查看结果

spark contains函数用法 spark函数教程_scala_18

(四)高阶函数

1、基本概念

  • 函数可以作为另一个函数的参数被传递或作为另一个函数的返回值。

2、案例演示

任务1、演示函数作为函数的参数

  • net.huawei.day08包里创建Example07对象

spark contains函数用法 spark函数教程_scala_19

  • 匿名函数x => println(x)作为函数printStr的返回值。
  • 函数printStr作为列表对象cities的foreach方法的实参。
  •  运行代码,查看结果

spark contains函数用法 spark函数教程_开发语言_20

任务2、演示函数作为函数的返回值

  • net.huawei.day08包里创建Example08对象