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

scala函数式编程

目录

不同范式对比:

1.面向对象编程

2.函数式编程

2.1函数基本语法

2.2函数和方法的区别

核心概念:

 2.3函数定义

 2.4函数参数

2.5 函数至简原则

2.6.高阶函数

 三.偏函数

四.柯里化函数

五.递归函数

递归函数注意点:

 六.控制抽象

1.值调用,把计算后的值传递过去,

 2.名调用,把代码传递过去,

七.惰性加载


不同范式对比:

  • 面向过程:按照步骤解决问题。

  • 面向对象:分解对象、行为、属性,通过对象关系以及行为调用解决问题。耦合低,复用性高,可维护性强。

面向对象和面向过程都是命令式编程,但是函数式编程不关心具体运行过程,而是关心数据之间的映射。纯粹的函数式编程语言中没有变量,所有量都是常量,计算过程就是不停的表达式求值的过程,每一段程序都有返回值。不关心底层实现,对人来说更好理解,相对地编译器处理就比较复杂。

函数式编程优点:编程效率高,函数式编程的不可变性,对于函数特定输入输出是特定的,与环境上下文等无关。函数式编程无副作用,利于并行处理,所以Scala特别利于应用于大数据处理,比如Spark,Kafka框架。

1.面向对象编程

解决问题,分解对象,行为,属性,然后通过对象的关系以及行为的调用来解决问题

对象的本质:对数据和行为的一个封装

2.函数式编程

解决问题时,将问题分解成一个个步骤,将每个步骤进行封装(函数),通过调用这些封装好的步骤,解决问题。

函数的本质:函数可以当作一个值进行传递

2.1函数基本语法

实例:需求:定义一个函数,实现将传入的名称打印出来。

object TestFunction {def main(args: Array[String]): Unit = {// (1)函数定义def f(arg: String): Unit = {println(arg) }// (2)函数调用 // 函数名(参数)f("hello world") } }

2.2函数和方法的区别

核心概念:

                 1.为完成某一功能的程序语句的集合,称之为函数

                 2.类中的函数称之为方法

Scala 语言可以在任何的语法结构中声明任何的语法

函数没有重载和重写的概念;方法可以进行重载和重写

Scala 中函数可以嵌套定义

 2.3函数定义

函数 1:无参,无返回值

函数 2:无参,有返回值

函数 3:有参,无返回值

函数 4:有参,有返回值

函数 5:多参,无返回值

函数 6:多参,有返回值

实例:

 

 2.4函数参数

可变参数,类似于Java,使用数组包装。(可变参数可以当作数组来用)

如果参数列表中存在多个参数,那么可变参数一般放置在最后

参数默认值,一般将有默认值的参数放置在参数列表的后面

带名称传参

 

 

 不给名称的就是按顺序赋值

调用时带名参数必须位于实参列表末尾

和默认参数一起使用会很方便,比如有多个默认参数,但只想覆盖其中一个

2.5 函数至简原则

  • 能省则省。
  • 最后一行代码会作为返回值,可以省略return
  • 函数体只有一行代码的话,可以省略花括号。
  • 如果返回值类型能够自动推断那么可以省略。
  • 如果函数体中用return做返回,那么返回值类型必须指定。
  • 如果声明返回Unit,那么函数体中使用return返回的值也不起作用。
  • 如果期望是无返回值类型,那么可以省略=。这时候没有返回值,函数也可以叫做过程。【2.13.0已废弃,能编过不过会提示。】
  • 无参函数如果声明时没有加(),调用时可以省略()。【如果声明时有()调用也可以省略,不过2.13.3废弃了。】
  • 不关心函数名称时,函数名称和def也可以省略,去掉返回值类型,将=修改为=>定义为匿名函数。

 

 

 

2.6.高阶函数

三种形式:函数作为值传递、函数作为参数、函数作为返回值。

作为值传递:经过赋值之后在底层变成一个lambda对象。

实例1模拟 Map 映射、Filter 过滤、Reduce 聚合

 

 三.偏函数

1.在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一 个不错的选择

2.将包在大括号内的一组case语句封装为函数,我们称之为偏函数,它只 对会作用于指定类型的参数或指定范围值的参数实施计算,超出范围的 值会忽略(未必会忽略,这取决于你打算怎样处理)

3.偏函数在Scala中是一个特质PartialFunction

 

偏函数总结:

使用构建特质的实现类(使用的方式是PartialFunction的匿名子类)

PartialFunction 是个特质(看源码)

构建偏函数时,参数形式 [Any, Int]是泛型,第一个表示参数类型,第二个表示 返回参数

当使用偏函数时,会遍历集合的所有元素,编译器执行流程时先执行isDefinedAt()如果为

true ,就会执行 apply, 构建一个新的Int 对象返回

执行isDefinedAt() 为false 就过滤掉这个元素,即不构建新的Int对象.

map函数不支持偏函数,因为map底层的机制就是所有循环遍历,无法过滤处理 原来集合

的元素

collect函数支持偏函数

实例1:对male,female,男,女,hello进行转义,string转换为int

四.柯里化函数

柯里化(Currying)指的是将原来接受多个参数的函数变成新的接受一个参数的函数,的多个参数列表的过程。

基本介绍:

函数编程中,接受多个参数的函数都可以转化为接受单个参数的函数,这个转 化过程就叫

柯里化

柯里化就是证明了函数只需要一个参数而已。其实我们刚才的学习过程中,已 经涉及到了

柯里化操作。

不用设立柯里化存在的意义这样的命题。柯里化就是以函数为主体这种思想发展的必然产

生的结果。(即:柯里化是面向函数思想的必然产生结果)

五.递归函数

一个函数/方法在函数/方法体内又调用了本身,我们称之为递归调用

递归函数注意点:

  • 方法调用自身。
  • 递归要有结束逻辑。
  • 调用自身时,传递参数要有规律。
  • scala中递归定义函数必须声明返回值类型,因为无法通过推导获得。
  • 纯函数式语言比如Haskell,连循环都没有,很多操作都需要通过递归来做,性能比较依赖尾递归优化。

实例:

 

 六.控制抽象

1.值调用,把计算后的值传递过去,

按值传递参数,计算值后再传递。多数语言中一般函数调用都是这个方式,C++还存在引用传递。

 

 2.名调用,把代码传递过去,

按名称传递参数,直接用实参替换函数中使用形参的地方。能想到的只有C语言中的带参宏函数,其实并不是函数调用,预处理时直接替换。

 

 java只有值调用,scala既有值调用,又有名调用

七.惰性加载

当函数返回值被声明为 lazy 时,函数的执行将被推迟,直到我们首次对此取值,该函 数才会执行。这种函数我们称之为惰性函数。

 

相关文章:

scala函数式编程

目录 不同范式对比: 1.面向对象编程 2.函数式编程 2.1函数基本语法 2.2函数和方法的区别 核心概念: 2.3函数定义 2.4函数参数 2.5 函数至简原则 2.6.高阶函数 三.偏函数 四.柯里化函数 五.递归函数 递归函数注意点: 六.控制抽象 1…...

网吧2023:热闹回来了,电竞战歌起

【潮汐商业评论/原创】 大年初四下午,人民公园附近尚未恢复往日热闹,上海网鱼电竞负责人崔潇瀚驱车前往位于人广世贸商场的网鱼电竞。 与广场上三两路人行色匆匆相比,门店显得忙碌异常,前台的服务叫单声响个不停,员工…...

代码随想录算法训练营第五十九天|503.下一个更大元素II、42. 接雨水

​ LeetCode 503 下一个更大元素II 题目链接:https://leetcode.cn/problems/next-greater-element-ii/ 思路: 方法一:两个for循环遍历单调栈 第一个for循环确定数组中的某个值在右边有最大的数,第二个for循环是为了可以使数组变成循环数…...

9、简单功能分析

文章目录1、静态资源访问1.1、静态资源目录1.2、如果静态资源与controller资源重名1.3、改变默认的静态资源路径1.4、修改静态资源访问前缀1.5、webjar2、欢迎页支持3、自定义 Favicon4、静态资源配置原理4.1、与Web开发有关的相关自动配置类4.2、WebMvcAutoConfiguration 注解…...

如何发送和接收参数?五种参数传递方法

通常情况下,我们可以使用GET或POST来发送请求和数据,但GET和POST两种方法所携带的数据都是比较简单的数据,接下来在我们这个基础上,列举5种比较负责的参数传递方法,并对这些参数如何发送,后台改如何接收做详…...

蓝桥杯C/C++VIP试题每日一练之矩形面积交

💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…...

Spark大数据处理讲课笔记2.4 IDEA开发词频统计项目

文章目录零、本讲学习目标一、词频统计准备工作(一)启动集群的HDFS与Spark(二)在HDFS上准备单词文件二、本地模式执行Spark程序(一)创建Maven项目(二)添加Spark相关依赖,…...

【ChatGPT 】国内无需注册 openai 即可访问 ChatGPT:ChatGPT Sidebar 浏览器扩展程序的安装与使用

一、前言 问题:国内注册 openai 账号麻烦,新必应有部分人也无法登录成功,存在域名单点登录失败等问题,所以无法真正使用 ChatGPT 解决:大部分人仅需使用 ChatGPT 的搜索功能,无需真正对话,需要…...

使用fetch()异步请求API数据实现汇率转换器

任务8 https://segmentfault.com/a/1190000038998601 https://chinese.freecodecamp.org/news/how-to-master-async-await-with-this-real-world-example/ 跟随上面的指示,理解异步函数的编写,并且实现这个汇率转换器。 第一步:在工作区初始…...

GPT-4“王炸”,10秒钟开发一套Web + APP 系统

10秒钟做出一个网站 一则有关GPT4发布会的视频在网上流传,这则两分钟的视频演示的内容是: 1. 在草稿本上用纸笔画出一个非常粗糙的草图; 2. 拍照告诉 GPT 我们要做一个网站,效果正如图所示,让其生成网站代码&#xff1…...

Disjoint 集合数据结构或 Union-Find 算法简介

联合查找算法是一种对此类数据结构执行两个有用操作的算法: 查找:确定特定元素在哪个子集中。这可用于确定两个元素是否在同一子集中。联合:将两个子集连接成一个子集。这里首先我们必须检查这两个子集是否属于同一个集合。如果否&#xff0c…...

uniapp中nvue与vue的区别?

文章目录简介nvue 和 vue 相互通讯方式:nvue注意事项:简介 uni-app是逻辑渲染分离的,渲染层在app端提供了两套排版引擎, 小程序方式的webview渲染和weex方式的原生渲染,两种渲染引入可以自己根据需要选。 vue文件走的…...

带头双向循环链表的实现

1.结构体的创建以及类型重定义 typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* prev;struct ListNode* next; }LTNode;2.链表的初始化 这个函数用于创建节点,后面还会用到。 LTNode* BuyListNode(LTDataType x) {LTNode* n…...

大屏使用dv-digital-flop定时刷新显示总人数

本文在基础上进行改进,后端使用若依后端IofTV-Screen: 🔥一个基于 vue、datav、Echart 框架的物联网可视化(大屏展示)模板,提供数据动态刷新渲染、屏幕适应、数据滚动配置,内部图表自由替换、Mixins注入等功…...

Java面向对象部分 个人学习记录

注:此博客是个人学习记录,会有错的地方,面向对象部分我可能会画很多图来加深我的理解 不引出了,直接开始 class Dog{String name;int age;String type;public Dog(String name,int age,String type){this.namename;this.ageage;this.typetyp…...

MySQL数据库——对Linux MySQL软件包的一些说明

Linux 操作系统的发行版很多,不同发行版下的 MySQL 版本也是不同的。MySQL 主要支持的 Linux 版本有 Red Hat Enterprise Linux 和 SUSE Linux Enterprise Server。这里主要介绍不同 Linux 发行版下 MySQL 支持的版本。 Linux 操作系统的 MySQL 软件包一般分为以下…...

【JavaEE进阶】——第二节.Spring核心和设计思想

文章目录 前言 一、Spring是什么? 二、什么是容器? 三、什么是IoC? 3.1 初始loC 3.2 举例解释loC 3.3 Spring IoC思想的体现 四、什么是DI? 4.1DI的概念 4.2 Ioc和DI的区别 总结 前言 今天我们将进入到有关spring的认识当中&…...

twitter开源算法(1)For You推荐系统架构

1 Twitter’s Recommendation Algorithm 我们的推荐系统由许多互相关联的服务(services)和工作(jobs)组成,本节这要是聚焦home timeline的for you feed流。 the-algorithm开源地址:https://github.com/twitter/the-algorithm 本篇博客来源&…...

A General Framework for Uncertainty Estimation in Deep Learning源码阅读(二)

接上文 ResNet定义: 代码使用 def ResNet18ADF(noise_variance1e-3, min_variance1e-3):return ResNet(BasicBlock, [2,2,2,2], num_classes10, noise_variance1e-3, min_variance1e-3, initialize_msraFalse)定义模型,其中ResNet定义为: …...

串行通信协议---HART协议

实际应用中,HART协议是仅次于Modbus协议的最接近统一现场总线的标准,主要是在4~20mA电流信号上面叠加数字信号,物理层采用Bell 202标准的FSK技术成功实现模拟信号和数字信号双向同时通信而互不干扰。HART协议规定了传输的物理形式、消息结构、…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...