千家信息网

Scala编程之闭包(closure)

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,一、概念闭包:我们把一个函数与其相关引用环境(变量)组合成一个整体叫做闭包概念晦涩难懂,下面我们用一个例子说明二、小例子def minusxy(x:Int) = (y:Int)=>x-yval f=m
千家信息网最后更新 2026年10月31日Scala编程之闭包(closure)

一、概念

闭包:我们把一个函数与其相关引用环境(变量)组合成一个整体叫做闭包
概念晦涩难懂,下面我们用一个例子说明

二、小例子

def minusxy(x:Int) = (y:Int)=>x-yval f=minusxy(20)println("f(1)="+f(1))//19println("f(2)="+f(2))//18

minusxy中x是匿名函数外部变量,但是却被用在匿名函数的里面,就像关在匿名函数里面一样,所以我们把一个函数与其相关引用环境(变量)组合成一个整体叫做闭包

解释:
1) (y: Int)=>x-y
返回的是一个匿名函数,因为该函数引用到到函数外的x,那么该函数和x整体形成一个闭包
如:这里val f= minusxy(20)的f函数就是闭包
2)你可以这样理解,返回函数是一个对象,而x就是该对象的一个字段,他们共同形成一个闭包
3)当多次调用f时(可以理解多次调用闭包),发现使用的是同一个x,所以ⅹ不变
4)在使用闭包时,主要搞清楚返回函数引用了函数外的哪些变量,因为他们会组合成一个整体(实体),形成一个闭包

相信你通过上面那个例子已经有所理解了,那么试试下面这个需求把

三、练练手

1)编写一个函数 makeSuffix(suffix: String)可以接收一个文件后缀名(比如.jpg),并返回一个闭包(closure)

2)调用闭包,可以传入一个文件名

如果该文件名没有指定的后缀(比如.jpg),则返回文件名.jpg。 文件名是 dog =》dog.jpg

如果已经有.jpg后缀,则返回原文件名。 文件名是cat.jpg => cat.jpg

3)要求使用闭包的方式完成

提示:String.endsWith(xx)
=========假装有条分割线=============

object ClosureDemo {  def main(args: Array[String]): Unit = {    val f=makeSuffix(".jpg")    println(f("cat"))    println(f("dog.jpg"))  }  /**    * 闭包    * @param suffix 变量    * @return    */  def makeSuffix(suffix:String)=(fileName:String)=>{if (fileName.endsWith(suffix)) fileName else fileName+suffix}}

四、闭包的好处

通过上边那个小练习我们知道,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如.jpg,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。

闭包 函数 文件 文件名 变量 后缀 整体 例子 传统 对象 就是 方法 概念 环境 晦涩 上边 分割线 功能 好处 字段 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么是科技互联网 互联网和科技创新 互联网科技财经 中资互联网科技 远信互联网科技 互联网金融和金融科技 互联网科技有限公司 翻译 互联网科技项目计划书材料类 新兴科技互联网创新大赛颁奖典礼 民营互联网公司国防科技 爱医互联网络科技 中天科技中国工业互联网 西安有哪些互联网高科技企业 陕西九四连强互联网科技有限公司 广州智享互联网科技 米泉互联网科技专业怎么样 北京军民互联网科技公司 安徽零酒互联网科技有限公司 第三届互联网大会安防黑科技 恒生科技指数 中概互联网 互联网属科技 卫星互联网科技股票 阿里巴巴算科技企业还是互联网 广州市恰铎互联网科技有限公司 企晟互联网信息科技有限公司 卓翼科技产业互联网合作 元气玛特互联网科技公司是外包吗 宁波跨境商互联网科技有限公司 好易买互联网科技 山东蛋芒互联网科技有限公司
0