0704-Scala函数式编程高级
Scala函数式编程高级
- 1. 偏函数
- 1.1 问题引入
- 1.2 偏函数
- 2. 作为参数的函数
- 3. 闭包
- 3.1 闭包入门
- 3.2 闭包案例
- 3.3 闭包的优势
- 4. 柯里化
- 5. 控制抽象
1. 偏函数
1.1 问题引入
给你一个集合val list = List(1, 2, 3, 4, “abc”) ,请完成如下要求:
- 将集合list中的所有数字+1,并返回一个新的集合
- 要求忽略掉 非数字 的元素,即返回的 新的集合 形式为 (2, 3, 4, 5)
- 解决方式一
val list = List(1,2,3,4,"abc")def f1(n : Any): Boolean = {n.isInstanceOf[Int]}def f2(n : Any): Int = {n.asInstanceOf[Int]}def f3(n: Int) : Int = {n + 1}list.filter(f1).map(f2).map(f3)
- 解决方式二: 模式匹配
val list = List(1,2,3,4,"abc")def addOne(i : Any): Any = {i match {case x : Int => x + 1case _ =>}}list.map(addOne)
- 使用偏函数
val list1: List[Int] = list.collect {case i: Int => i + 1}
1.2 偏函数
- 在
对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数
是一个不错的选择- 将包在
大括号内的一组case语句封装为函数
,我们称之为偏函数,它只对会作用于指定类型的参数或指定范围值的参数
实施计算,超出范围的值会忽略.- 偏函数在Scala中是一个特质PartialFunction
2. 作为参数的函数
3. 闭包
3.1 闭包入门
- 基本介绍:闭包就是一个函数和与其相关的引用环境(变量/值)组合的一个整体(实体)。
def minusxy(x: Int) = (y: Int) => x – y
//minusxy 他会返回一个匿名函数 (y: Int) => x – y
//匿名函数,他使用了一个外部的变量 x
//f函数就是闭包.
val f: Int => Int = minusxy(20)
println("f(1)=" + f(1))
println("f(2)=" + f(2))
- 代码小结
(1) (y: Int) => x – y
返回的是一个匿名函数 ,因为该函数引用到到函数外的 x,那么 该函数和x整体形成一个闭包
如:这里 val f = minusxy(20) 的f函数就是闭包
(2) 可以这样理解,返回函数是一个对象,而x就是该对象的一个字段,他们共同形成一个闭包
(3) 当多次调用f时(可以理解多次调用闭包),发现使用的是同一个x, 所以x不变。
(4)在使用闭包时,主要搞清楚返回函数引用了函数外的哪些变量,因为他们会组合成一个整体(实体),形成一个闭包
3.2 闭包案例
请编写一个程序,具体要求如下
- 编写一个函数 makeSuffix(suffix: String) 可以接收一个文件后缀名(比如.jpg),并返回一个闭包
- 调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg , 如果已经有.jpg后缀,则返回原文件名。
- 要求使用闭包的方式完成
- String.endsWith(xx)
def makeSuffix(suffix: String): String => String = {(filename : String)=> {if (filename.endsWith(suffix)){filename}else{filename + suffix}}}val file: String => String = makeSuffix(".jpg")val filename: String = file("jdj")val filename2: String = file("xxx.jpg")
3.3 闭包的优势
- 返回的匿名函数和 makeSuffix (suffix string) 的 suffix 变量 组合成一个闭包,因为返回的函数引用到suffix这个变量
- 体会一下闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如 .jpg ,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。大家可以仔细的体会一把
4. 柯里化
编写一个函数,接收两个整数,可以返回两个数的乘积,要求:
- 使用常规的方式完成
- 使用闭包的方式完成
- 使用函数柯里化完成
def mul(x: Int, y: Int) = x * y
println(mul(10, 10))def mulCurry(x: Int) = (y: Int) => x * y
println(mulCurry(10)(9))def mulCurry2(x: Int)(y:Int) = x * y
println(mulCurry2(10)(8))
// 将接受多个参数的函数都可以转化为接受单个参数的函数,这个转化过程就叫柯里化
5. 控制抽象
可以理解为传递的是一段逻辑, 一段代码
- 参数是函数
- 函数参数没有输入值也没有返回值
() => Unit
def myRunInThread(f1: () => Unit) = {new Thread {override def run(): Unit = {f1()}}.start()}myRunInThread {() =>println("干活咯!5秒完成...")Thread.sleep(5000)println("干完咯!")}
// 省略括号def myRunInThread(f1: => Unit) = {new Thread {override def run(): Unit = {f1()}}.start()}myRunInThread {println("干活咯!5秒完成...")Thread.sleep(5000)println("干完咯!")}
var x = 10def until(condition: => Boolean)(block: => Unit): Unit = {//类似while循环,递归if (condition) {blockuntil(condition)(block)}}until(x > 0) {x -= 1println("x=" + x)}// 可以理解为: 参数有多行改用{}
0704-Scala函数式编程高级相关推荐
- 【中英双语】高级Scala函数式编程
[中英双语]高级Scala函数式编程 成为顶级 Scala 程序员,这样您就可以使用 Spark.Akka.Cats 或任何 Scala 工具!此教程共13.5小时,中英双语字幕,画质清晰无水印,源码 ...
- Scala函数式编程设计原理 第一课 编程范式(Programming Paradigms)
我使用Scala有一两年的时间了,这门语言仿佛有一种魔力,让人用过就不想放手.Scala给我的整个程序生涯带来了非常深刻的影响,让我学会了函数式编程,让我知道了世界上居然还有这么一种优雅.高效.强大的 ...
- Scala函数式编程(三) scala集合和函数
前情提要: scala函数式编程(二) scala基础语法介绍 scala函数式编程(二) scala基础语法介绍 前面已经稍微介绍了scala的常用语法以及面向对象的一些简要知识,这次是补充上一章的 ...
- Scala 函数式编程_部分应用函数_Partially Applied Functions
2019独角兽企业重金招聘Python工程师标准>>> Scala 函数式编程部分应用函数或函数的部分应用 和其他遵循函数式编程范式的语言一样,Scala 允许部分应用一个函数. 调 ...
- scala函数式编程 educoder
第一关:冒泡排序 本关任务:本关主题是利用Scala基础实现对冒泡排序算法的改进.使用冒泡算法存在这样一种情况:在第j(j<n-1)趟时就已排好序,但算法仍然执行后面几趟的比较.实际上,一旦算法 ...
- 【编程语言】Scala 函数式编程
函数是Scala 中的一等公民. 本文讨论Scala函数式编程的一些基本原理.你将会学到如何使用高阶函数,以及重用已有代码时,遵守 DRY 原则. Scala 的集合库很棒 # So what doe ...
- scala函数式编程_想要开始进行函数式编程,请进入scala
scala函数式编程 意见 (Opinion) If you haven't used Scala yet, you're not the only one: Not even four percen ...
- 周末班补充视频Scala第2课:动手编写和运行自己的第一个Scala函数式编程的实例.
周末班补充视频Scala第2课:动手编写和运行自己的第一个Scala函数式编程的实例. package com.dtspark.scala.functional.basics object MyFir ...
- 大数据技术之_16_Scala学习_09_函数式编程-高级
大数据技术之_16_Scala学习_09 第十三章 函数式编程-高级 13.1 偏函数(partial function) 13.1.1 提出一个需求,引出思考 13.1.2 解决方式-filter ...
- scala函数式编程笔记: 纯函数式状态
scala函数式编程:纯函数式状态读书笔记 Overview: 带状态的方法的声明式实现可能带有副作用,难以保持引用透明. 以纯函数式的方式实现带状态的函数的关键在于让状态更新是显式的,不要以副作用方 ...
最新文章
- opencv4.4的下载与安装(1)
- 框架:初识Mybatis
- cxTreeList交换当前两个节点的的位置
- mysql分页存储过程 分页查询语句_分页存储过程(用存储过程实现数据库的分页代码)...
- python 内置模块 subprocess
- 70 SD配置-发票凭证配置-定义回扣协议类型
- ios运行html游戏,Objective-c / iOS – 使用Safari打开本地html文件
- vue页面回显数据_解决vue表单回显数据无法修改的问题
- MATLAB学习笔记 :函数文件的定义和使用
- Ppmap - XSS扫描器
- 最全浏览器兼容性问题以及解决方案
- 用HTML+CSS做一个漂亮简单的轻量级图片相册博客网站(web前端期末大作业)
- html图形渐变颜色一半一半,CSS3第八课:重复线性渐变repeating-linear-gradient
- Linux LASA声卡驱动之三:PCM设备的创建
- Adobe突然查封中国账号,设计社区Behance无权访问!
- 这段可笑的代码更坚定了我在VB.NET上的信心了
- 10分钟快速搭建实战Web项目:生鲜电商
- Desperate Housewife 1-1
- Kubernetes 集群文件描述符测漏了...
- java毕业生设计中小学教务管理平台计算机源码+系统+mysql+调试部署+lw
热门文章
- 用大数据把电视观众“挖”出来
- D3.入门教程——简介和安装
- MLP is Maybe Your Need
- Blender 2.8 【修改器】快捷键备忘录 学习笔记
- iP138查询网,ip数据库
- rn在java中什么意思,RN150中RN是什么意思
- 关于阿里云个人网站备案流程的介绍
- 北斗终端与计算机传输信息,基于北斗信息的手机终端的应用研究
- c语言用二维数组遍历 “tic tac toe“ 输出游戏结果
- mysql查询1999年后出生的_饭后笑笑 1999年出生的和2000年出生的秘密