大数据技术——函数式编程基础

news2025/3/10 16:00:51

函数定义与使用

定义函数最通用的方法是作为某个类或者对象的成员,这种函数被称为方法。

其定义的基本语法为:

def 方法名(参数列表):结果类型方法体}

字面量包括整数字面量、浮点数字面量、布尔型字面量、字符字面量、字符串字面量、符号字面量、函数字面量和元组字面量

除了函数字面量我们会比较陌生以外,其他几种字面量都很容易理解

  • 函数字面量可以体现函数式编程的核心理念

  • 在函数式编程中,函数是“头等公民”,可以像任何其他数据类型一样被传递和操作,也就是说,函数的使用方式和其他数据类型的使用方式完全一致了

● 这时,我们就可以像定义变量那样去定义一个函数,由此导致的结果是,函数也会和其他变量一样,开始有“值”

  • 就像变量的“类型”和“值”是分开的两个概念一样,函数式编程中,函数的“类型”和“值”也成为两个分开的概念,函数的“值”,就是“函数字面量”

下面一点点引导大家更好地理解函数的“类型”和“值”的概念

现在定义一个大家比较熟悉的传统类型的函数,定义的语法和我们之前介绍过的定义“类中的方法”类似(实际上,定义函数最常用的方法是作为某个对象的成员,这种函数被称为方法):

上面定义个这个函数的“类型”如下:

实际上,只有多个参数时(不同参数之间用逗号隔开),圆括号才是必须的,当参数只有一个时,圆括号可以省略,如下:

下面看看如何得到函数的“值”

实际上,我们只要把函数定义中的类型声明部分去除,剩下的就是函数的“值”,如下:

注意:上面就是函数的“值”,需要注意的是,采用“=>”而不是“=”,这是Scala的语法要求

现在,我们再按照大家比较熟悉的定义变量的方式,采用Scala语法来定义一个函数。

声明一个变量时,我们采用的形式是:

照葫芦画瓢,我们也可以按照上面类似的形式来定义Scala中的函数:

从上面可以看出,在Scala中,函数已经是“头等公民”,单独剥离出来了“值”的概念,一个函数“值”就是函数字面量。这样,我们只要在某个需要声明函数的地方声明一个函数类型,在调用的时候传一个对应的函数字面量即可,和使用普通变量一模一样

我们不需要给每个函数命名,这时就可以使用匿名函数,如下:

上面这种匿名函数的定义形式,我们经常称为“Lambda表达式”。

Lambda表达式”的形式如下:

我们可以直接把匿名函数存放到变量中,下面是在Scala解释器中的执行过程:

实际上,Scala具有类型推断机制,可以自动推断变量类型,比如下面两条语句都是可以的:

所以,上面的定义中,我们可以myNumFunc的类型声明。也就是去掉“Int=>lnt”,在Scala解释器中的执行过程如下:

下面我们再尝试一下,是否可以继续省略num的类型声明,在Scala解释器中的执行过程如下:

可以看出,解释器会报错,因为,全部省略以后,实际上,解释器也无法推断出类型

下面我们尝试一下,省略nun的类型声明,但是,给出myNumFunc的类型声明,在Scala解释器中的执行过程如下:

不会报错,因为,给出了myNumFunc的类型为

“Int=>Int”以后,解释器可以推断出num类型为Int类型。

当函数的每个参数在函数字面量内仅出现一次,可以省略“=>”并用下划线“_”作为参数的占位符来简化函数字面量的表示,第一个下划线代表第一个参数,第二个下划线代表第二个参数,依此类推

高阶函数

高阶函数:当一个函数包含其它函数作为其参数或者返回结果为一个函数时,该函数被称为高阶函数

例:假设需要分别计算从一个整数到另一个整数的“连加和”、“平方和”以及“2的幂次和”

方案一:不采用高阶函数

方案二:采用高阶函数

针对容器的操作

遍历操作

Scala容器的标准遍历方法foreach

简化写法:“list foreach(i=>println(i))”或“list foreach println

简化写法:

映射操作

映射是指通过对容器中的元素进行某些运算来生成一个新的容器。

两个典型的映射操作是map方法和flatMap方法

map方法(一对一映射):将某个函数应用到集合中的每个元素,映射得到一个新的元素,map方法会返回一个与原容器类型大小都相同的新容器,只不过元素的类型可能不同

flatMap方法(一对多映射):将某个函数应用到容器中的元素时,对每个元素都会返回一个容器(而不是一个元素),然后,flatMap把生成的多个容器“拍扁”成为一个容器并返回。返回的容器与原容器类型相同,但大小可能不同,其中元素的类型也可能不同

过滤操作

过滤:遍历一个容器,从中获取满足指定条件的元素,返回一个新的容器

filter方法:接受一个返回布尔值的函数f作为参数,并将f作用到每个元素上,..将f返回真值的元素组成-一个新容器返回

规约操作

规约操作是对容器元素进行两两运算,将其“规约”为一个值

reduce方法:接受一个二元函数f作为参数,首先将f作用在某两个元素王并返回严个值,然后再将f作用在上严个M返回值和容器的下一个元素上,再返回一个值,依此类推,最后容器中的所有值会被规约为一个值

reduceLeft和reduceRight:前者从左到右进行遍历,后者从右到左进行遍历

fold方法:一个双参数列表的函数,从提供的初始值开始规约。第一个参数列表接受一个规约的初始值,第二个参数列表接受与reduce中一样的二元函数参数

foldLeft和foldRight:前者从左到右进行遍历,后者从右到左进行遍历

函数式编程示例WordCount

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/386186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

hdfs的读写数据流程

读: (1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。 (2)挑选一台DataNode(就近原则,然后随机&…

学习机器学习应该看哪些书籍?

机器学习是一种人工智能技术,它通过利用计算机算法和数学模型,使计算机系统能够自动从数据中学习,从而不断改进其性能。它是一种数据驱动的方法,可以让计算机从经验中学习,而无需明确地编程。具体来说,机器…

python学习——【第一弹】

前言 Python是一种跨平台的计算机程序设计语言,是ABC语言的替代品,属于面向对象的动态类型语言,最初被设计用于编写自动化脚本,随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。 从这篇…

怎样成为一名黑客:六个方法让你无所不能

黑客这个名字一直是伴随着互联网发展而来,给大家的第一印象就是很酷,而且技术精湛,在网络世界里无所不能。目前几乎所有的公司企业甚至国家相关部门都会争相高薪聘请技术精湛的黑客作为互联网机构的安全卫士,所以黑客也是很多人比…

【老王读Spring Transaction-7】一个数据源的事物管理配置 与 多数据源的事物管理配置

前言 大多数 Spring 应用程序只有一个数据源,只需要一个事务管理器(TransactionManager)。 但是在多个数据源的情况下,我们就需要在一个应用程序中配置多个独立的事务管理器。 我们可以通过 Transactional 的 value 或 transactionManager 属性来指定让…

shell数值计算

P23 回顾shell基础知识 shell执行多条命令 一行内,分号分割多条命令。比如cd /tmp ;echo hello ;cd - 其中cd -为回到此行命令开始前的目录多行echo和转义字符 双引号里输出$n等特殊字符时,实用\转义,来原样输出字符单引号中字符不进行替换&…

ES6的简单使用

1.ES6基本介绍1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给标准化组织 ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布 262 号标准文件(ECMA-262)的第一版,…

Vue表单数据修改与删除

学习来源:视频p6 书接上文 目录页面修改修改对话框视频教程的做法后端提供接口前端调用接口修改完成后提交删除功能后端开设接口前端调用最终成果展示页面修改 将之前的 BookManage 页面的按钮改为想要的功能 可以注意到修改按钮的标签以及绑定了事件 handleClick…

RK3568核心板以太网大数据测试报告-万象奥科

1. 测试对象HD-RK3568-IOT 底板基于HD-RK3568-CORE工业级核心板设计(双网口、双CAN、5路串口),接口丰富,适用于工业现场应用需求,亦方便用户评估核心板及CPU的性能。适用于工业自动化控制、人机界面、中小型医疗分析器…

docker环境下docker-compose一键式搭建fastdfs文件存储服务系统

前言 本节内容我们使用docker-compose一键式搭建一套fastdfs服务,实现docker环境下的文件存储服务,在开始本节内容之前,我们需要提前安装好docker和docker-compose环境。fastdfs是一套分布式的文件存储服务系统,主要有tracker和s…

pipenv的基本使用

一. pipenv 基础 pipenv安装: pip install pipenvpipenv常用命令 pipenv --python 3 # 创建python3虚拟环境 pipenv --venv # 查看创建的虚拟环境 pipenv install 包名 # 安装包 pipenv shell # 切换到虚拟环境中 pip list # 查看当前已经安装的包&#xff0…

地方征信平台第2讲:河北省征信

河北省征信有限公司,注册成立于2022年12月25日,注册资本6330万元人民币。股东及持股比例如下:河北省惠信大数据科技服务有限公司、35.1975%。唐山国控集团有限公司、14.22%。石家庄城控投资集团有限责任公司、 10.8215%。石家庄市国有资本经营…

【017】筛选数据并整理(筛选、返回行号、清除全部数据)_#VBA

自动化办公1. 筛选1.1 在某一基础上筛选1.2 多条件筛选2. 返回行号3. 删除某列重复数据4. 删除当页全部数据5. 求和6. 复制黏贴6.1 第一种6.2 第二种6.2 第三种7. 全部数据1. 筛选 主要使用的命名方式如下 ActiveSheet.Range("$A$1:$L$41500").AutoFilter Field:1,…

打电话哪款蓝牙耳机好?打电话好的蓝牙耳机推荐

耳机除了听歌之外,还经常会用到接听电话。很多真正的无线耳机,在宣传页面上,都会着重介绍自己的耳机在降噪、音质方面的性能,以及他们自己的耳机的性能,下面分享几款打电话好的蓝牙耳机。 一、南卡小音舱蓝牙耳机 蓝…

人机交互设计概述

人机交互的软件工程实践 1.人机交互设计概述 交互设计视图提高产品或系统的可用性和用户体验。他首先研究、了解某类用户的需求,然后再通过设计来满足用户的需求。随着产品和操作变得越来越复杂,越需要用户掌握新技能,因此设计师对如何能帮…

密码学基础(一)常见密码算法分类

一、密码算法分类: 密码算法主要分为三类:对称密码算法、 非对称密码算法、摘要算法。 二、对称密码算法(Symmetric-key Algorithm) 1、概念 对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算…

8Manage PMO:如何借助系统软件解决多项目管理难点

随着企业不断发展壮大,大多数企业不管性质、规模和行业如何,都会同时进行多个项目,这已然成为一个普遍现象。虽然多项目管理可以提高资源利用率,加速项目交付,但同时也会带来一系列的难点。 如何在多个项目之间有效地…

Python基于词频排序快速挖掘需求大类

Python基于词频排序快速挖掘需求大类 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 一、所有的代码 这是所有的代码 from collections import defaultdict import jieba.posseg a…

华为机试题:HJ101 输入整型数组和排序标识,对其元素按照升序或降序进行排序(python)

文章目录(1)题目描述(2)Python3实现(3)知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

数字信息-数字编码挂钩法

一、前方无路,一切才刚开始0呼啦圈 1蜡烛2鹅 3金元宝4青龙5钩子6哨子 7七仙女8八卦镜9药酒二、少年中国说看到“1”想到“树”,想到“树”,想到“智慧树”,再想到“少年智则国智”看到“2”想到“鸭子”,想到“鸭子”&…