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 我们要做一个网站,效果正如图所示,让其生成网站代码࿱…...

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

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协议规定了传输的物理形式、消息结构、…...

【独家】华为OD机试 - 寻找密码(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本期题目:寻找密码 题目 小王在进行游…...

FPGA有哪些优质的带源码的IP开源网站?
这是某乎上的一个问题,我觉得还不错,今天就系统性的总结一下1、fpga4funhttps://www.fpga4fun.com/你能在这个网站上找到什么?您可以找到信息页面,以及使用 FPGA 板构建的 FPGA 项目。注重点:项目。FPGA 项目使用一种称…...

基于模型预测控制(MPC)的微电网调度优化的研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Postman接口测试之Mock快速入门
一、Mock简介 1.Mock定义 Mock是一种比较特殊的测试技巧,可以在没有依赖项的情况下进行接口或单元测试。通常情况下,Mock与其他方法的区别是,用于模拟代码依赖对象,并允许设置对应的期望值。简单一点来讲,就是Mock创建…...

分享一个国内可用的免费ChatGPT网站
背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾🌋。 作为一个程序员,我也忍不住做了一个基于ChatGPT的网站,免费!免登陆!!国内可直接对话ChatGPT,也…...

15. 三数之和(Java)
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 …...

Navicat Premium 16安装教程
1.鼠标右击【Navicat Premium 16(64bit)】压缩包(win11及以上系统需先选择“显示更多选项”)选择【解压到 Navicat Premium 16(64bit)】。 2.打开解压后的文件夹,鼠标右击【setup】选择【以管理员身份运行】。 3.点击【下一步】。 4.选择【我…...

蓝桥杯刷题冲刺 | 倒计时8天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.三角形的面积2.图中点的层次1.三角形的面积 题目 链接: 三角形的面积 - 蓝桥云课 …...

四.JAVA基础面试题:重要知识
四.JAVA基础面试题:重要知识 1.为什么JAVA只有值传递 2.JAVA获取运行时类的四种方式 四.JAVA基础面试题:重要知识 1.为什么JAVA只有值传递 实参:传递给形参的实际参数。 形参:接受实参的参数。值传递:方法接受实参…...

某面试官分享经验:看求职者第一眼,开口说第一句话,面试结果就差不多定了,准确率高达90%以上...
我们以前分享过许多经验,但大多是站在打工人的视角上,今天给大家带来一个面试官的经验:1. 看求职者第一眼,开口说第一句话,面试结果就差不多定了,准确率高达90%以上。2. 绝不考八股文,如果问技术…...