当前位置: 首页 > news >正文

【scala】匿名函数和高阶函数

packagecom.hdfs.functaionobjectAnonymous{defmain(args:Array[String]):Unit={AnonymousFunction println(normalcalc(2,3,4))println(curriedCalc(2)(3)(4))println(curriedCalcee(2)(3)(4))}defAnonymousFunction():Unit={/** * 匿名函数,函数字面量,没有命令的函数 * (参数列表)=>表达式 */valadd=(x:Int,y:Int)=>x+y println(add(4,7))}defnormalcalc(a:Int,b:Int,c:Int):Int=a*b+cdefcurriedCalc(a:Int)(b:Int)(c:Int):Int=a*b+cdefcurriedCalcee(a:Int):Int=>Int=>Int={(b:Int)=>(c:Int)=>a*b+c}// 高阶函数:参数1=列表,参数2=处理函数(Int=>String),返回处理后的新列表defprocessNumber(nums:List[Int],f:Int=>String):List[String]={nums.map(f)}//调用:传入不同的匿名函数作为处理逻辑valnumbers=List(1,2,3,4)//场景1:将数字转为”数字-偶数/奇数“格式valevenOddDesc=processNumber(numbers,num=>s"$num${if(num%2==0)"偶数"else"奇数"}")println(evenOddDesc)// 场景2:将数字转换为平方字符串(简化为占位符语法)valsquareDesc=processNumber(numbers,num=>s"${num}的平方=${num*num}")println(squareDesc)// 高阶函数:接收操作类型,返回(Int,Int)=> Int类型的函数defgetCalculator(op:String):(Int,Int)=>Int={opmatch{case"+"=>(a,b)=>a+b// 返回加法匿名函数case"*"=>(a,b)=>a*b// 返回乘法匿名函数case"-"=>(a,b)=>a-b// 返回减法匿名函数case_=>(_,_)=>0// 默认返回0}}// 调用:先获取函数,在执行计算valaddFunc=getCalculator("+")valmulFun=getCalculator("*")println(addFunc(3,4))println(mulFun(3,4))// 即接受又返回函数(函数装饰器)//高阶函数:接收一个计算函数,返回增强后的函数defwithLog(f:(Int,Int)=>Int):(Int,Int)=>Int={(a,b)=>{println(s"开始计算:$a$b")valresult=f(a,b)// 执行原函数println(s"计算完成,结果:$result")result}}// 原普通函数defadd(a:Int,b:Int):Int=a+b// 增强后函数valaddWithLog=withLog(add)privatevali:Int=addWithLog(10,20)println("[i] "+i)/** * Scala内置高阶函数 */valnums=List(1,2,3,4,5)privatevalints:List[Int]=nums.filter(_%2==0)println("[ints] "+ints)privatevalints1:List[Int]=nums.map(_*2)println("[ins1] "+ints1)privatevalsum:Int=nums.reduce(_+_)println("[sum] "+sum)// fold:带初始值的reduceprivatevali1:Int=nums.fold(10)(_+_)println("[i1] "+i1)// flatmap:扁平化映射privatevalwords:List[String]=List("Hello Scala","Hello Functional")privatevalflatWords:List[String]=words.flatMap(_.split(",")).flatMap(_.split(" "))println("[flatWords] "+flatWords)/** * 高阶函数核心总结 * 用法类型 核心场景 示例函数 * 接收函数作为参数 集合处理、Spark RDD 转换 map/filter/reduce * 返回函数作为结果 函数工厂、柯里化、参数固定 getCalculator * 既接收又返回函数 函数增强(日志、缓存、异常处理) withLog * 高阶函数的核心价值是逻辑解耦:将「通用流程」(如遍历、聚合)和「具体业务逻辑」(如计算、过滤条件)分离,大幅提升代码复用性和可读性。 */deflog(level:String)(model:String)(msg:String):Unit={println(s"[$level][$model][$msg]")}valriskInfoLog=log("INFO")("测试系统")_ riskInfoLog("数据处理完成")riskInfoLog("执行加载完成")}
http://www.jsqmd.com/news/144321/

相关文章:

  • 2025年12月国内百/千/万/十万/三十万/百万级洁净实验室装修公司实力盘点:这几家行业标杆值得关注! - 品牌推荐用户报道者
  • C语言实现GBK到Unicode的字符转换
  • 将Forest应用的数据库从Derby迁移至MySQL
  • 帕普斯与帕斯卡定理的射影几何证明
  • 探索英威腾CHE100 - 2406变频器:学习路上的宝藏资料
  • 高清在线测试视频资源合集(含多分辨率MP4链接)
  • 第1章 Shell基础语法核心(20例,初级运维)-补充内容002【子Shell相关知识补充】
  • oem718d RTK基准站设置与测量操作全解析
  • 抖音直播卖货起号-桃李账号的不足
  • 大家常用的数据迁移工具
  • Open-AutoGLM 2.0云机上线:3大颠覆性升级如何重塑企业级AI部署格局
  • 基于多款软件的电池包仿真分析之旅
  • C4D材质基础:从金属到玻璃的质感模拟
  • 坐标转换与投影:解决 WebGIS 的坐标混乱问题
  • 5G核心网架构及会话管理关键技术解析
  • 从零到精通:掌握智谱清言沉思模式的8个核心指令与1个关键触发条件
  • 智谱AutoGLM开源了?手把手教你获取Open-AutoGLM源码并快速上手,错过等一年!
  • Ionic Framework发布Vue版本更新与修复
  • 线性代数核心概念与解题方法精要
  • 【紧急收藏】Open-AutoGLM刷机失败怎么办?这7种解决方案必须知道
  • 拒绝“乱跑”!基于电鱼智能 AM3354 的全天候打窝船精准航迹控制方案
  • 3Dmax模型与Vray材质如何高效转C4D用Octane渲染
  • 采煤区光伏电站远程监控运维管理系统方案
  • 【12G】供热空调设计全套资料包免费下载
  • 如何通过企业微信服务中心电话,实现高效协同、客户服务? - 品牌2026
  • 9个降AI率工具推荐!研究生高效避坑指南
  • 【Open-AutoGLM 支持苹果吗】:深度解析苹果生态下的AI大模型兼容性与部署方案
  • 还在手动写测试用例?Open-AutoGLM一键生成方案大曝光
  • 《节能与新能源汽车技术路线图2.0》发布
  • 智普AutoGLM开源了吗?一文看懂Open-AutoGLM真实开源状态与替代方案