Spark学习笔记07:Scala函数

本文深入探讨Scala中的函数,包括显式和隐式声明、成员方法、局部函数、匿名函数、高阶函数、神奇占位符、闭包、可变参数和尾递归。通过实例解析函数的使用,如加法、阶乘、过滤集合和处理集合等操作。同时,介绍了蓝桥杯竞赛题中因数和问题的解决方案和优化算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、声明函数

(一)显式声明函数

1、声明格式

2、注意事项

3、案例演示

    (1)加法函数

    (2)阶乘函数

(二)隐式声明函数

1、声明格式

2、注意事项

3、案例演示

    (1)加法函数

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

    (3)打印直角三角形

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

二、Scala函数种类

(一)成员方法

1、基本概念

2、案例演示

    案例1:显示文件中长度超过15的行

    案例2:显示文件中包含字符scala的行

(二)局部函数

1、基本概念

2、案例演示

(三)匿名函数

1、基本概念

2、案例演示

(四)高阶函数

1、基本概念

2、案例演示

    案例1、演示函数作为函数的参数

    案例2、演示函数作为函数的返回值

三、神奇占位符

(一)基本概念

(二)案例演示

案例1、演示过滤集合

案例2、演示处理集合

案例3、演示参数占位符

四、闭包

(一)基本概念

(二)案例演示

案例:演示闭包

五、可变参数

(一)基本概念

(二)案例演示

案例1、演示可变参数

案例2、定义任意多个数据求和的函数

六、尾递归

(一)基本概念

(二)案例演示

案例:计算1 + 3 + 5…,总和超过50就返回

七、因数和(蓝桥杯竞赛题)

1、编写程序,实现功能

2、优化算法


一、声明函数

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

(一)显式声明函数

1、声明格式

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

2、注意事项

  • 函数通过def关键字定义
  • def前面可以具有修饰符,可以通过privateprotected来控制其访问权限。注意默认访问权限是public
  • 还可使用overridefinal等关键字修饰

3、案例演示

    (1)加法函数

    (2)阶乘函数

显式声明阶乘函数并调用

(二)隐式声明函数

1、声明格式

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

2、注意事项

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

3、案例演示

    (1)加法函数

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

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

    (3)打印直角三角形

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

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

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

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

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

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

二、Scala函数种类

(一)成员方法

1、基本概念

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

2、案例演示

    案例1:显示文件中长度超过15的行

    案例2:显示文件中包含字符scala的行

(二)局部函数

1、基本概念

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

2、案例演示

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

(三)匿名函数

1、基本概念

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

2、案例演示

案例:将函数赋值给常量

(四)高阶函数

1、基本概念

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

2、案例演示

    案例1、演示函数作为函数的参数

  • 匿名函数x => println(x)作为函数printStr的返回值。
  • 函数printStr作为列表对象citiesforeach方法的实参。

    案例2、演示函数作为函数的返回值

三、神奇占位符

(一)基本概念

Scala中的下划线_是一个神奇的占位符,可以用它当作一个或多个参数来使用。

(二)案例演示

案例1、演示过滤集合

案例2、演示处理集合

案例3、演示参数占位符

四、闭包

(一)基本概念

在函数定义时,如果用到了上下文中的变量,则函数的具体执行将会和该变量的值具有了相关性,即这个函数包含了外部该变量的引用,这个过程称之为函数的闭包。这种情况下,变量值的变化将会影响函数的执行,同样函数执行的过程中改变了变量的值,也会影响其他位置对变量的使用。

(二)案例演示

案例:演示闭包

五、可变参数

(一)基本概念

Scala中,可以指明函数的最后一个参数是重复的

(二)案例演示

案例1、演示可变参数

 

案例2、定义任意多个数据求和的函数

  • 当方法需要多个相同类型的参数时,可以指定最后一个参数为可变长度的参数列表,只需要在最后一个参数的类型之后加入一个星号即可。

  • 在方法内部,重复参数的类型实际上是一个数组。因此,上述方法中的参数b的类型实际上是一个Int类型的数组,即Array[Int]。可以使用如下代码对上述方法进行调用。

  • 但是如果直接向方法addData()传入一个Int类型的数组,编译器反而会报错 - 类型不匹配

  • 需要在数组参数后添加一个和一个_*符号,这样告诉编译器把数组arr的每个元素分别当作参数,而不是将数组当作单一的参数传入。

  • 虽然结果跟先前一样,但是有个警告,从Scala2.13.0开始,这种处理数组的方式已被废弃掉了,建议使用ArraySeq.unsafeWrapArraytoIndexedSeq来处理

六、尾递归

(一)基本概念

  • Scala中为了避免使用while循环需要用递归。如果在递归时,保证函数体的最后一行为调用自己的代码,则称这样的递归为尾递归,Scala会优化它来大大提高其性能。

(二)案例演示

案例:计算1 + 3 + 5…,总和超过50就返回

七、因数和(蓝桥杯竞赛题)

1、编写程序,实现功能

2、优化算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值