Spark-Scala语言实战(3)

在之前的文章中,我们学习了如何在来如何在IDEA离线和在线安装Scala,想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。

Spark-Scala语言实战(2)(在IDEA中安装Scala,超详细配图)-CSDN博客https://blog.csdn.net/qq_49513817/article/details/136719556?spm=1001.2014.3001.5501

目录

一、知识回顾

二、函数

1.无参函数

2.带参函数

3.匿名函数

三、任务实现

拓展-


一、知识回顾

在之前的文章中,我们学习了定义常量变量和数组,以及九九乘法表的实现。

相信定义的方法大家没有忘记吧

无非就是val和var的区别,一个是常量,一个是变量,很好理解记忆,主要是要了解它们的用法。

其次,在上一篇文章结尾我们也了解到了一些常见的函数。

今天,我就来教大家如何定义函数。

二、函数

1.无参函数

我们先从简单的无参函数开始,我只需要我的函数给我输出一个"Hello, World!",该怎么操作呢?接着往下看。

def greet(): Unit = {
  println("Hello, World!")
}

greet() // 调用函数,输出 "Hello, World!"

这样,我们就定义了一个名为greet的函数,它的内容很简单,就是输出我们所需的"Hello, World!",来看看效果吧。

2.带参函数

在带参函数中,其实和无参的区别不大,但是要注意我们的调用方法。

def add(a: Int, b: Int): Int = {  
  a + b  
}  
  
val sum = add(3, 4) // 调用函数,并将结果赋值给变量sum  
println(sum) // 输出 7

我们首先定义了一个add函数,再把它作完相加的值赋给sum,然后输出sum,来看看效果吧。

3.匿名函数

在Scala中,匿名函数是一种没有名称的函数,它们常常作为参数传递给其他函数,或者在某些情况下直接用于表达简单的逻辑。Scala的匿名函数是通过=>符号来定义的,它左侧是参数列表,右侧是函数体。

来个简单的匿名函数看看

val add = (a: Int, b: Int) => a + b  
val sum = add(3, 4) // 调用匿名函数,并将结果赋值给变量sum  
println(sum) // 输出 7

可能单单一个大家看不出来区别,再来个难的

匿名函数作为返回值

def createMultiplier(factor: Int): Int => Int = {  
  (num: Int) => num * factor // 返回匿名函数  
}  
  
val triple = createMultiplier(3) // 创建一个函数,该函数将输入的数字乘以3  
val result = triple(5) // 调用返回的函数,并将结果赋值给变量result  
println(result) // 输出 15

这样就很直观吧,多做对比。

三、任务实现

用Scala写一个电话号码归属地以输入的号码前几位的字段来区分,在输入号码后告知是联通移动电信还是错误的号码,号码字段用数组来存贮。

object p2 {
  // 假设电话号码的前三位或四位代表不同的运营商
  // 这里使用数组来存储号码字段和对应的运营商
  val phonePrefixes = Array(
    ("130", "131", "132", "155", "156", "185", "186", "1709") -> "联通",
    ("134", "135", "136", "137", "138", "139", "150", "151", "152", "157", "158", "159", "182", "183", "184", "187", "188", "198", "1705", "1340") -> "移动",
    ("133", "153", "180", "181", "189", "1700") -> "电信"
  )

  // 函数来根据号码前缀判断运营商
  def classifyPhoneNumber(phoneNumber: String): String = {
    // 提取号码的前几位作为前缀
    val prefix = phoneNumber.take(4) // 假设前四位是足够的
    // 查找前缀对应的运营商
    phonePrefixes.find(_._1.contains(prefix)).map(_._2).getOrElse("错误的号码")
  }

  // 程序的入口点
  def main(args: Array[String]): Unit = {
    val phoneNumber = "13800138000" // 示例号码,请替换为实际输入的号码
    val operator = classifyPhoneNumber(phoneNumber)
    println(s"号码 $phoneNumber 的归属运营商是: $operator")
  }

}

我在 find 方法中使用了一个匿名函数 prefixSet => prefixSet._1.contains(prefix) 这样做是为了提高代码的可读性,并且使类型推断更加明确。

现在,编译并运行这个代码,它应该可以正确地根据电话号码前缀判断归属运营商了。

拓展-scala自定函数的种类作用

函数种类 描述 作用
成员函数 定义在类的内部,作为类的成员 成员函数能够访问和修改类的内部状态,实现对象的行为和属性。它们是面向对象编程的基石,允许通过对象来执行操作。
本地函数 定义在另一个函数内部 本地函数用于封装一段特定的逻辑,只在其定义的函数内部可见和使用。它们可以提高代码的可读性和可维护性,通过将复杂的逻辑分解为更小的函数。
匿名函数 没有函数名,通过=>来连接参数列表和方法体 匿名函数可以作为参数传递给其他函数,也可以作为返回值返回。它们常用于高阶函数中,作为回调函数或谓词使用。匿名函数的灵活性使得代码更加简洁和易读。
高阶函数 将函数作为参数传递或返回的函数 高阶函数允许将函数作为一等公民来处理,可以像处理其他数据类型一样传递和返回函数。这使得代码更加模块化和可重用,能够编写更加抽象和通用的函数。
函数种类 描述 作用
柯里化函数(Curried Functions) 将一个接受多个参数的函数转换为一系列接受单一参数的函数 柯里化函数允许我们将复杂的函数分解为一系列更简单的函数,从而增强函数的复用性和可读性。
偏函数(Partial Functions) 只定义在其定义域子集上的函数 偏函数在处理某些特定条件或异常情况时非常有用,它们允许我们定义只在某些输入上有效的函数。
递归函数(Recursive Functions) 在函数体内部调用自身的函数 递归函数常用于处理树形结构或需要重复执行的任务,它们通过将问题分解为更小的子问题来解决复杂的问题。
尾递归函数(Tail Recursive Functions) 递归调用出现在函数体的最后位置(即尾部)的函数 尾递归函数在Scala中经过优化,可以避免栈溢出的问题,从而允许处理更大的数据集。
隐式函数(Implicit Functions) 通过隐式转换和隐式参数自动应用的函数 隐式函数提供了在编译时自动插入转换和参数的机制,从而简化代码并增强类型安全性。
相关推荐
6.941 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
lucky_syq1 小时前
Flume和Kafka的区别?
大数据·kafka·flume
AI_NEW_COME2 小时前
构建全方位大健康零售帮助中心:提升服务与体验
大数据·人工智能
it噩梦2 小时前
es 中 terms set 使用
大数据·elasticsearch
中科岩创2 小时前
中科岩创边坡自动化监测解决方案
大数据·网络·物联网
DolphinScheduler社区3 小时前
作业帮基于 Apache DolphinScheduler 3_0_0 的缺陷修复与优化
大数据
SeaTunnel3 小时前
京东科技基于 Apache SeaTunnel 复杂场景适配 #数据集成
大数据
小_太_阳4 小时前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾4 小时前
scala借阅图书保存记录(三)
开发语言·后端·scala
喝醉酒的小白5 小时前
Elasticsearch 配置文件
大数据·elasticsearch·搜索引擎