当前位置: 首页 > news >正文

Spark-Scala语言实战(3)

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

Spark-Scala语言实战(2)(在IDEA中安装Scala,超详细配图)-CSDN博客icon-default.png?t=N7T8https://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)通过隐式转换和隐式参数自动应用的函数隐式函数提供了在编译时自动插入转换和参数的机制,从而简化代码并增强类型安全性。

相关文章:

  • Spring Boot:筑基
  • 【滑动窗口】长度最小的子数组|无重复字符的最长子串|最大连续1的个数 III|将 x 减到 0 的最小操作数
  • EPSON XV4001BC陀螺仪传感器汽车导航系统的应用
  • LabVIEW NV色心频率扫描
  • C#,图论与图算法,计算无向连通图中长度为n环的算法与源代码
  • 热插拔技术详解(中)
  • Python分析无人驾驶汽车在桂林市文旅行业推广的问卷
  • Java基础-IO流
  • neo4j使用详解(一、Linux安装)
  • 什么是Spring Boot
  • 【Greenhills】MULTI IDE-GHS最新版本Compiler 23.5.4的兼容性问题
  • 如何查看局域网内所有的ip和对应的mac地址
  • Django单表数据库操作
  • OpenSearch 2.x 版本文档部署 CSS 丢失的问题
  • 后端开发要不要转鸿蒙?
  • 10个最佳ES6特性 ES7与ES8的特性
  • Kibana配置logstash,报表一体化
  • markdown编辑器简评
  • yii2权限控制rbac之rule详细讲解
  • 欢迎参加第二届中国游戏开发者大会
  • 技术胖1-4季视频复习— (看视频笔记)
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 日剧·日综资源集合(建议收藏)
  • 入门到放弃node系列之Hello Word篇
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 最近的计划
  • scrapy中间件源码分析及常用中间件大全
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​520就是要宠粉,你的心头书我买单
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #pragma once与条件编译
  • #宝哥教你#查看jquery绑定的事件函数
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)EOS中账户、钱包和密钥的关系
  • (转)nsfocus-绿盟科技笔试题目
  • .NET Core 版本不支持的问题
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • @ModelAttribute使用详解
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [1525]字符统计2 (哈希)SDUT
  • [20150904]exp slow.txt
  • [ACTF2020 新生赛]Upload 1
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • [ERROR] 不再支持目标选项 5。请使用 7 或更高版本
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo
  • [Hive] CTE 通用表达式 WITH关键字
  • [JAVA设计模式]第二部分:创建模式
  • [LeetCode]-使用特殊算法的题目-2
  • [Linux基础开发工具---vim]关于vim的介绍、vim如何配置及vim的基本操作方法