===================== Scala函数式编程 ========================

一、Scala中的函数
(*) 函数是Scala中的头等公民,就和数字一样,可以在变量中存放函数,即:将函数作为变量的值(值函数)。

  1. def myFunc1(name:String):String = "Hello " + name
  2. println(myFunc1("Tom"))
  3.  
  4. def myFunc2():String = "Hello World"
  5.  
  6. //值函数:把函数作为变量的值
  7. val v1 = myFunc1("Tom")
  8. val v2 = myFunc2()
  9.  
  10. //再将v1付给myFunc1
  11. println(myFunc1(v1))

运行:

  1. myFunc1: myFunc1[](val name: String) => String
  2. Hello Tom
  3. res0: Unit = ()
  4.  
  5. myFunc2: myFunc2[]() => String
  6.  
  7. v1: String = Hello Tom
  8. v2: String = Hello World
  9.  
  10. Hello Hello Tom
  11. res1: Unit = ()

二、匿名函数:没有名字的函数

  1. //匿名函数:没有名字的函数
  2. // 完整: def myFunc3(x:Int) = x * 3
  3. (x:Int) => x*3
  4.  
  5. //举例:Array(1,2,3) ====> (3,6,9)
  6. Array(1,2,3).map((x:Int) => x*3)

运行:

  1. res2: Int => Int = <function1>
  2. res3: Array[Int] = Array(3, 6, 9)

三、高阶函数:带函数参数的函数
注意:把一个函数作为另外一个函数的参数值

四、高阶函数示例

  1. //高阶函数
  2. import scala.math._
  3.  
  4. //对数字10进行某种运算
  5. //f : 就是执行的运算
  6. def someAction(f:(Double)=>Double) = f(10)
  7.  
  8. //测试
  9. //情况1:开平方
  10. someAction(sqrt)
  11. someAction(sin)
  12.  
  13. //另一个例子
  14. def mytest(x:Int,y:Int):Int = { x*y + 10}
  15.  
  16. //定义一个高阶函数
  17. def myFunction(f:(Int,Int)=>Int,x:Int,y:Int)=f(x,y)
  18.  
  19. //调用
  20. myFunction(mytest,2,3)

运行:

  1. import scala.math._
  2.  
  3. someAction: someAction[](val f: Double => Double) => Double
  4.  
  5. res0: Double = 3.1622776601683795
  6. res1: Double = -0.5440211108893698
  7.  
  8. mytest: mytest[](val x: Int,val y: Int) => Int
  9.  
  10. myFunction: myFunction[](val f: (Int, Int) => Int,val x: Int,val y: Int) => Int
  11.  
  12. res2: Int = 16

数据:

  1. val numbers = List(1,2,3,4,5,6,7,8,9,10)

map: 作用于列表中的每个元素,并且返回一个新的列表

  1. numbers.map((i:Int) => i*2)

foreach: 跟map一样,没有返回值

  1. numbers.foreach((i:Int) => i*2)

filter: 移除函数函数false的元素
返回所有能够被2整除的元素

  1. numbers.filter((i:Int)=> i%2 ==0 )

zip: 把两个列表合并到一个列表中

  1. List(1,2,3).zip(List(4,5,6))

数据:

  1. val numbers = List(1,2,3,4,5,6,7,8,9,10)

partition: 能被2整除的放到一个分区中,不能被整除的放到另一个分区中

  1. numbers.partition((i:Int) => i%2 ==0)

find: 第一个匹配条件的元素
找到第一个能被3整除的元素

  1. numbers.find((x:Int) => x%3 == 0)
  2.  
  3. numbers.find(_ % 3 == 0)

flatten: 把一个嵌套的结构展开

  1. List(List(1,2,3),List(4,5,6)).flatten

flatMap: 压平,结合了map和flatten的功能

  1. var myList = List(List(1,2,3),List(4,5,6))
  2. myList.flatMap(x=>x.map(_ *2))

分为两步
1、List(1,2,3),List(4,5,6) ===> 合并成一个List
2、再乘以2

运行以上例子的结果:

  1. numbers: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  2.  
  3. res0: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
  4.  
  5. res1: Unit = ()
  6.  
  7. res2: List[Int] = List(2, 4, 6, 8, 10)
  8.  
  9. res3: List[(Int, Int)] = List((1,4), (2,5), (3,6))
  10.  
  11. res4: (List[Int], List[Int]) = (List(2, 4, 6, 8, 10),List(1, 3, 5, 7, 9))
  12. res5: Option[Int] = Some(3)
  13.  
  14. res6: Option[Int] = Some(3)
  15.  
  16. res7: List[Int] = List(1, 2, 3, 4, 5, 6)
  17.  
  18. myList: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6))
  19. res8: List[Int] = List(2, 4, 6, 8, 10, 12)
  20. score: scala.collection.mutable.Map[String,Int] = Map(Mike -> 90)
  21. res9: Unit = ()
  22. Map(Mike -> 85)
  23. res10: Unit = ()

五、闭包: 就是函数的嵌套
在一个函数定义中,包含了另一个函数的定义;在内函数中可以访问外函数中的变量

定义函数:乘法运算

  1. def myfunc(x:Int,y:Int) = x * y

采用闭包

  1. def mulBy(factor:Double)=(x:Double)=> x * factor

第一个参数:factor 乘法因子,乘以的倍数
第二个参数:(x:Double)匿名函数,接收一个double数据变量

测试:
乘以3倍

  1. val triple = mulBy(3) //3代表乘法因子

---> triple是值函数,接收一个参数(x)

  1. triple(10) //10就是x,结果30
  2. triple(6) //18

除以2的操作

  1. val half = mulBy(0.5)
  2. half(10) //5

六、柯里化:Currying
柯里化函数:把具有多个参数的函数转换成一个函数链,每个节点上的都是一个单一参数的函数
举例:
以下两个函数是等价

  1. def add(x:Int,y:Int)= x + y
  2. def add(x:Int)(y:Int) = x + y ===> Scala柯里化的语法 

大数据笔记(二十五)——Scala函数式编程的更多相关文章

  1. 大数据笔记(十五)——Hive的体系结构与安装配置、数据模型

    一.常见的数据分析引擎 Hive:Hive是一个翻译器,一个基于Hadoop之上的数据仓库,把SQL语句翻译成一个  MapReduce程序.可以看成是Hive到MapReduce的映射器. Hive ...

  2. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  3. 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础

    第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...

  4. 大数据入门第二十五天——elasticsearch入门

    一.概述 推荐路神的ES权威指南翻译:https://es.xiaoleilu.com/010_Intro/00_README.html 官网:https://www.elastic.co/cn/pr ...

  5. 大数据技术之_16_Scala学习_09_函数式编程-高级

    第十三章 函数式编程-高级13.1 偏函数(partial function)13.1.1 提出一个需求,引出思考13.1.2 解决方式-filter + map 返回新的集合13.1.3 解决方式- ...

  6. 大数据笔记(十二)——使用MRUnit进行单元测试

    package demo.wc; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.io.IntW ...

  7. Java基础学习笔记二十五 MySQL

    MySQL 在dos中操作mysql 连接mysql命令: mysql -uroot -p密码 ,连接OK,会出现mysql> 对数据库的操作 创建一个库 create database 库名 ...

  8. 论文阅读笔记二十五:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition(SPPNet CVPR2014)

    论文源址:https://arxiv.org/abs/1406.4729 tensorflow相关代码:https://github.com/peace195/sppnet 摘要 深度卷积网络需要输入 ...

  9. 大数据入门第二十五天——logstash入门

    一.概述 1.logstash是什么 根据官网介绍: Logstash 是开源的服务器端数据处理管道,能够同时 从多个来源采集数据.转换数据,然后将数据发送到您最喜欢的 “存储库” 中.(我们的存储库 ...

  10. 大数据笔记(十)——Shuffle与MapReduce编程案例(A)

    一.什么是Shuffle yarn-site.xml文件配置的时候有这个参数:yarn.nodemanage.aux-services:mapreduce_shuffle 因为mapreduce程序运 ...

随机推荐

  1. 洛谷 P5150 生日礼物 题解

    题面 因为 n=lcm(a,b)n = lcm(a, b)n=lcm(a,b) ,可以得出: a  和 b  的质因数都是 n 的质因数 对于 n  的每个质因数 x ,在 n 中的次数为 y ,那么 ...

  2. 文件的三种打开方式及with管理文件上下文

    文件的三种打开方式及with管理文件上下文 一.文件的三种打开方式 1.1 只读 f = open(r'D:\pycharm\yjy\上海python学习\456.txt','r',encoding= ...

  3. zk ui安装 (选装,页面查看zk的数据)

    # 使用WEB UI查看监控集群-zk ui安装 cd /usr/local git clone https://github.com/DeemOpen/zkui.git yum install -y ...

  4. Solution for automatic update of Chinese word segmentation full-text index in NEO4J

    Solution for automatic update of Chinese word segmentation full-text index in NEO4J 1. Sample data 2 ...

  5. 作业调度框架Quartz.NET-现学现用-01-快速入门 - 简书

    原文:作业调度框架Quartz.NET-现学现用-01-快速入门 - 简书 前言 你需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行.一个自动执行而无须干预 ...

  6. Jquery复习(十)之$.fn.extend()

    定义和用法 $.fn.extend() 函数为jQuery扩展一个或多个实例属性和方法(主要用于扩展方法). 提示:jQuery.fn是jQuery的原型对象,其extend()方法用于为jQuery ...

  7. TS学习

    随着vue3.0的即将到来,是时候学习一下TS了 简介:TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类 ...

  8. Solr IK分词器配置

    下载地址:https://search.maven.org/search?q=com.github.magese 分词器配置: 参考:https://www.cnblogs.com/mengjinlu ...

  9. MySQL主备同步延迟

    今天看到mycat的日志,发现在wrapper.log中频繁warning:slave延迟23006秒 查看数据指标: show engine innodb status正常,而且slave的拷贝点在 ...

  10. Linux查看及设置系统时区

    一.什么是时区呢? 关于时区的概念,其实初中地理课已经涉及,很多人都多少了解一些,可能只是细节搞不太清楚.为什么会将地球分为不同时区呢?因为地球总是自西向东自转,东边总比西边先看到太阳,东边的时间也总 ...