大数据笔记(二十五)——Scala函数式编程
===================== Scala函数式编程 ========================
一、Scala中的函数
(*) 函数是Scala中的头等公民,就和数字一样,可以在变量中存放函数,即:将函数作为变量的值(值函数)。
def myFunc1(name:String):String = "Hello " + name
println(myFunc1("Tom")) def myFunc2():String = "Hello World" //值函数:把函数作为变量的值
val v1 = myFunc1("Tom")
val v2 = myFunc2() //再将v1付给myFunc1
println(myFunc1(v1))
运行:
myFunc1: myFunc1[](val name: String) => String
Hello Tom
res0: Unit = () myFunc2: myFunc2[]() => String v1: String = Hello Tom
v2: String = Hello World Hello Hello Tom
res1: Unit = ()
二、匿名函数:没有名字的函数
//匿名函数:没有名字的函数
// 完整: def myFunc3(x:Int) = x * 3
(x:Int) => x*3 //举例:Array(1,2,3) ====> (3,6,9)
Array(1,2,3).map((x:Int) => x*3)
运行:
res2: Int => Int = <function1>
res3: Array[Int] = Array(3, 6, 9)
三、高阶函数:带函数参数的函数
注意:把一个函数作为另外一个函数的参数值
四、高阶函数示例
//高阶函数
import scala.math._ //对数字10进行某种运算
//f : 就是执行的运算
def someAction(f:(Double)=>Double) = f(10) //测试
//情况1:开平方
someAction(sqrt)
someAction(sin) //另一个例子
def mytest(x:Int,y:Int):Int = { x*y + 10} //定义一个高阶函数
def myFunction(f:(Int,Int)=>Int,x:Int,y:Int)=f(x,y) //调用
myFunction(mytest,2,3)

运行:
import scala.math._ someAction: someAction[](val f: Double => Double) => Double res0: Double = 3.1622776601683795
res1: Double = -0.5440211108893698 mytest: mytest[](val x: Int,val y: Int) => Int myFunction: myFunction[](val f: (Int, Int) => Int,val x: Int,val y: Int) => Int res2: Int = 16
数据:
val numbers = List(1,2,3,4,5,6,7,8,9,10)
map: 作用于列表中的每个元素,并且返回一个新的列表
numbers.map((i:Int) => i*2)
foreach: 跟map一样,没有返回值
numbers.foreach((i:Int) => i*2)
filter: 移除函数函数false的元素
返回所有能够被2整除的元素
numbers.filter((i:Int)=> i%2 ==0 )
zip: 把两个列表合并到一个列表中
List(1,2,3).zip(List(4,5,6))
数据:
val numbers = List(1,2,3,4,5,6,7,8,9,10)
partition: 能被2整除的放到一个分区中,不能被整除的放到另一个分区中
numbers.partition((i:Int) => i%2 ==0)
find: 第一个匹配条件的元素
找到第一个能被3整除的元素
numbers.find((x:Int) => x%3 == 0) numbers.find(_ % 3 == 0)
flatten: 把一个嵌套的结构展开
List(List(1,2,3),List(4,5,6)).flatten
flatMap: 压平,结合了map和flatten的功能
var myList = List(List(1,2,3),List(4,5,6))
myList.flatMap(x=>x.map(_ *2))
分为两步
1、List(1,2,3),List(4,5,6) ===> 合并成一个List
2、再乘以2
运行以上例子的结果:
numbers: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) res0: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20) res1: Unit = () res2: List[Int] = List(2, 4, 6, 8, 10) res3: List[(Int, Int)] = List((1,4), (2,5), (3,6)) res4: (List[Int], List[Int]) = (List(2, 4, 6, 8, 10),List(1, 3, 5, 7, 9))
res5: Option[Int] = Some(3) res6: Option[Int] = Some(3) res7: List[Int] = List(1, 2, 3, 4, 5, 6) myList: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6))
res8: List[Int] = List(2, 4, 6, 8, 10, 12)
score: scala.collection.mutable.Map[String,Int] = Map(Mike -> 90)
res9: Unit = ()
Map(Mike -> 85)
res10: Unit = ()
五、闭包: 就是函数的嵌套
在一个函数定义中,包含了另一个函数的定义;在内函数中可以访问外函数中的变量
定义函数:乘法运算
def myfunc(x:Int,y:Int) = x * y
采用闭包
def mulBy(factor:Double)=(x:Double)=> x * factor
第一个参数:factor 乘法因子,乘以的倍数
第二个参数:(x:Double)匿名函数,接收一个double数据变量
测试:
乘以3倍
val triple = mulBy(3) //3代表乘法因子
---> triple是值函数,接收一个参数(x)
triple(10) //10就是x,结果30
triple(6) //18
除以2的操作
val half = mulBy(0.5)
half(10) //5
六、柯里化:Currying
柯里化函数:把具有多个参数的函数转换成一个函数链,每个节点上的都是一个单一参数的函数
举例:
以下两个函数是等价
def add(x:Int,y:Int)= x + y
def add(x:Int)(y:Int) = x + y ===> Scala柯里化的语法
大数据笔记(二十五)——Scala函数式编程的更多相关文章
- 大数据笔记(十五)——Hive的体系结构与安装配置、数据模型
一.常见的数据分析引擎 Hive:Hive是一个翻译器,一个基于Hadoop之上的数据仓库,把SQL语句翻译成一个 MapReduce程序.可以看成是Hive到MapReduce的映射器. Hive ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
- 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础
第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...
- 大数据入门第二十五天——elasticsearch入门
一.概述 推荐路神的ES权威指南翻译:https://es.xiaoleilu.com/010_Intro/00_README.html 官网:https://www.elastic.co/cn/pr ...
- 大数据技术之_16_Scala学习_09_函数式编程-高级
第十三章 函数式编程-高级13.1 偏函数(partial function)13.1.1 提出一个需求,引出思考13.1.2 解决方式-filter + map 返回新的集合13.1.3 解决方式- ...
- 大数据笔记(十二)——使用MRUnit进行单元测试
package demo.wc; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.io.IntW ...
- Java基础学习笔记二十五 MySQL
MySQL 在dos中操作mysql 连接mysql命令: mysql -uroot -p密码 ,连接OK,会出现mysql> 对数据库的操作 创建一个库 create database 库名 ...
- 论文阅读笔记二十五:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition(SPPNet CVPR2014)
论文源址:https://arxiv.org/abs/1406.4729 tensorflow相关代码:https://github.com/peace195/sppnet 摘要 深度卷积网络需要输入 ...
- 大数据入门第二十五天——logstash入门
一.概述 1.logstash是什么 根据官网介绍: Logstash 是开源的服务器端数据处理管道,能够同时 从多个来源采集数据.转换数据,然后将数据发送到您最喜欢的 “存储库” 中.(我们的存储库 ...
- 大数据笔记(十)——Shuffle与MapReduce编程案例(A)
一.什么是Shuffle yarn-site.xml文件配置的时候有这个参数:yarn.nodemanage.aux-services:mapreduce_shuffle 因为mapreduce程序运 ...
随机推荐
- Luogu P4438 [HNOI/AHOI2018]道路
题目 注意到\(n\)不大并且深度不大. 记\((u,ls_u)\)为\(L\)边,\((u,rs_u)\)为\(r\)边. 所以我们可以设\(f_{p,i,j}\)表示从根到\(p\)有\(i\)条 ...
- 如何利用`keep-alive`按需缓存页面数据
随着项目不断变大,页面变多,搜索条件也随之也越来越多,而每次跳转页面再返回时,之前的筛选的条件都会别清空.之前在elment-ui table组件 -- 远程筛选排序提到过缓存,但是有所取巧,这次重新 ...
- 不用再去找rem了,你想要的rem都在这
一.兼容性. 目前,IE9+,Firefox.Chrome.Safari.Opera 的主流版本都支持了rem(大胆用吧,目前几乎所有手机浏览器都支持rem) 二.什么是rem. rem是相对于根元素 ...
- PHP之常用第三方库
汇总常用的第三方库,方便快速进行开发,避免重复造轮子 1. 时间相关 nesbot/carbon(在编写 PHP 应用时经常需要处理日期和时间,使用Carbon 会很方便– 继承自 PHPDateTi ...
- Windows下搭建Nacos及Seata
一.简介 本文主要描述Nacos及Seata在Windows环境下环境搭建 下载相关软件: Nacos-1.1.4 Seata-0.9.0 二.安装 2.1安装Nacos 解压nacos-server ...
- Librepilot-Windows编译环境的搭建
1.安装Msys2 下载Msys2,下载地址 https://msys2.github.io,注意根据笔记本的型号选择32bit或64bit. 2.添加LibrePilot MinGW库 在 /e ...
- tar/gzip/zip文件打包、压缩命令
一.tar打包备份工具 1.命令功能 tar 将多个文件或目录打包在一起,可用通过调用gzip或zip实现压缩.解压的命令:tar不仅可以多多个文件进行打包,还可以对多个文件打包后进行压缩. 2.语法 ...
- Codeforces Gym 100814C Connecting Graph 树剖并查集/LCA并查集
初始的时候有一个只有n个点的图(n <= 1e5), 现在进行m( m <= 1e5 )次操作 每次操作要么添加一条无向边, 要么询问之前结点u和v最早在哪一次操作的时候连通了 /* * ...
- Jmeter插件介绍
JMeterPlugin可以把JMeter生成的jtl文件做出很好的统计图,同时还支持机器的cpu.memory.swap.disk io和network的监控. 插件可分四类: 用于服务器性能监视的 ...
- MySQL优化建议与使用规范
适用场景:并发量大.数据量大的互联网业务;可以先阅读必须掌握的MySQL优化指南 一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源 ...