葡萄是什么茎| 1940年出生属什么生肖| 拔牙吃什么消炎药好| 女生什么时候最容易怀孕| 今年贵庚是什么意思| 浓鼻涕吃什么药| 什么的星空| 筋是什么组织| 送女生什么生日礼物比较好| 苔菜是什么菜| 头顶秃了一小块是什么原因怎么办| 运动喝什么水补充能量| 蒲地蓝消炎片治什么病| 支线是什么意思| 鹿晗是什么星座| 以纯属于什么档次| 高同型半胱氨酸血症吃什么药| 五倍子是什么| 奇门遁甲什么意思| 暴饮暴食会得什么病| 为什么女人要带阴环| 晚饭适合吃什么| 三角梅什么时候开花| 促销员是做什么的| 什么药能治阳痿早泄| b1是什么| hrd是什么职位| t1w1高信号代表什么| 荨麻疹长什么样图片| dob值阳性是什么意思| 蚂蚁咬了用什么药| 头发有点黄是什么原因| 糖精对人体有什么危害| 淡定从容是什么意思| 怀孕吃什么有营养| 肝fnh是什么病| 小脑萎缩吃什么药效果最好| 肠胃炎适合吃什么食物| 风寒水饮是什么意思| 衣冠禽兽指什么生肖| 吃什么润肺| 青瓜和黄瓜有什么区别| 属相鸡与什么属相相合| 左手尾戒什么意思| 油烟机什么牌子好| 气喘是什么原因| 生肖本命带红花是什么生肖| 来例假吃什么水果好| 中国最高学历是什么| 维生素d3和d2有什么区别| 潮吹是什么样的| 多囊有什么症状| 肛门出血是什么原因| 行号是什么| 什么情况下需要做心脏造影| 大脑供血不足是什么原因引起的| 肺气肿什么症状| 1973属什么生肖| 额头上长斑是什么原因造成的| 幼字五行属什么| 管教有方是什么意思| 盐酸安罗替尼胶囊主要治疗什么| 去脂肪粒最有效的药膏叫什么| 倾尽所有什么意思| 男生小肚子疼是什么原因| bpd是胎儿的什么意思| sk-ll是什么牌子| 膀胱ca是什么意思| 肝囊肿吃什么食物好| 女性分泌物发黄是什么原因| 荔枝和什么不能一起吃| 遂成大学的遂是什么意思| 内伤是什么意思| 2001年属什么| mlf操作是什么意思| 去医院检查是否怀孕挂什么科| 常见的贫血一般是缺什么| 生物包括什么| 珍贵的动物是什么生肖| 大肠杆菌吃什么药| 钝角是什么意思| 一生无虞是什么意思| 心慌是什么原因导致的| dxm是什么药| 冒汗是什么原因| 肩周炎是什么症状| 为什么会得糖尿病| 香字五行属什么| 见利忘义是什么生肖| 梦见以前的朋友是什么意思| 梦见别人家拆房子是什么预兆| 第二天叫什么日| 书到用时方恨少什么意思| 梭是什么意思| 517是什么星座| 今年属于什么生肖| wlw是什么意思| 1999年是什么生肖| 挑染什么颜色好看| 水溶性是什么意思| 前列腺钙化斑是什么意思| 大枣和红枣有什么区别| 7月14什么星座| 生理期没来是什么原因| 男朋友有什么用| 兵马俑在什么地方| 治疗胃反酸烧心用什么药最好| 为什么生气会胃疼| 吃什么补肾壮阳最快速| 3月是什么星座的| 闪点什么意思| 背弃是什么意思| 卵泡排出来是什么样的| 蒲公英治什么病| 高危性行为是什么| 3000年前是什么朝代| 病毒是什么生物| 拉肚子能喝什么| 反流性咽喉炎吃什么药| 什么是根号| 神的国和神的义指的是什么| 射手座喜欢什么样的女生| 小腿浮肿是什么原因引起的| 环比增长什么意思| 张柏芝什么星座| 什么的草帽| 射不出来是什么原因| 呼吸内科主要看什么病| 为什么会肾虚| 什锦是什么水果| 维生素b2有什么功效| h是什么意思| 瞌睡多是什么原因| 黄晓明的老婆叫什么名字| 血糖高早餐吃什么好| 毒瘾为什么那么难戒| 副鼻窦炎是什么意思| 吉祥是什么生肖| 梦见旋风是什么预兆| 偶尔胸闷是什么原因| 怀孕一个月有点见红是什么情况| 03属什么| 淼念什么| 松解手术是什么| 胃疼想吐是什么原因| 吝啬什么意思| 拉肚子吃什么水果好| 浑身发热是什么原因| 什么星座最好| 百衲衣是什么意思| 食色性也什么意思| 什么水果可以减肥刮油脂| 苋菜不能和什么一起吃| 空调水滴是什么模式| 什么人不适合喝骆驼奶| 什么事每人每天都必须认真的做| 左脸上长痘痘是什么原因| 为什么晚上睡觉老是做梦| 父亲的弟弟叫什么| 黄芪和什么泡水壮阳| 通字五行属什么| 湿热内蕴是什么意思| 牙髓是什么| 什么的交流| 黄体不足吃什么补最快| 慧五行属什么| 十八岁属什么生肖| 女人要矜持是什么意思| 屌丝男是什么意思| 小腿浮肿吃什么药| 海参什么季节吃好| 颏下是什么部位| 唇炎抹什么药膏最有效| 平光眼镜是什么意思| 时间h代表什么| 红豆是什么意思| 大姨妈期间可以吃什么水果| 王五行属性是什么| 结节有什么症状| 姨妈期可以做什么运动| 六味地黄丸什么牌子好| 社畜什么意思| 头昏和头晕有什么区别| 女性更年期在什么年龄段| 为什么会长闭口粉刺| 双离合是什么意思| 哈尔滨机场叫什么名字| 孙悟空最后成了什么佛| 印是什么意思| 寄生虫长什么样子| ubras是什么牌子| 少将相当于地方什么级别| 鸡和什么属相最配对| 小孩吃牛肉有什么好处| crs是什么意思| 冥冥之中是什么意思| 鳕鱼不能和什么一起吃| 下身痒是什么原因| 一血是什么意思| 纵隔子宫是什么意思| 鹤字五行属什么| 心衰有什么症状| 正常白带是什么味道| 脂膜炎是什么病| 乘胜追击什么意思| 什么东西能解酒| 梦见发面是什么意思| 猫死后为什么要挂在树上| 宅是什么意思| 广东有什么特产| c反应蛋白偏高是什么原因| 英语什么时候学最好| 板楼是什么意思| 瑜伽是什么意思| 胃肠湿热吃什么中成药| 庚子是什么意思| 子宫破裂有什么危险| 绿豆和什么相克中毒| 颈椎病用什么药最好| 老夫是什么意思| 38是什么意思| 变态反应是什么意思| 月抛是什么意思| 为什么生理期过后最容易掉秤| 房颤有什么症状| 白虎关是什么意思| 中科院是干什么的| 11月7号是什么星座| 尿红色是什么原因| 裂纹舌是什么原因| 全身燥热是什么原因引起的| et什么意思| 眉毛白了是什么原因引起的| 金针菇为什么叫明天见| 崎字五行属什么| 指桑骂槐是什么生肖| 7月一日是什么节日| 咖色裤子配什么颜色上衣| 什么是袖珍人| 母亲节买什么礼物| 查血清能查出什么病| 嗓子痒咳嗽吃什么药| 血沉是查什么病的| 两特两重指的是什么| 96年五行属什么| qs认证是什么意思| 消化不良吃什么中药| ct和磁共振有什么区别| 2月2号什么星座| 上不下要念什么| 日入是什么时辰| 什么是品牌| 降血压喝什么茶| ct和核磁共振有什么区别| 碘伏是什么| 穆萨是什么意思| 向日葵为什么会随着太阳转动| 吃无花果有什么好处| 过期的牛奶有什么用途| 家里为什么会有隐翅虫| 吃什么对牙齿有好处| 茉莉花茶属于什么茶| 窦卵泡是什么意思| 甲亢是什么引起的| 百度

大中城市联合招聘会周六西安揽才 提供3500余岗位

本文详细介绍了Scala中的高阶函数,通过实例展示其如何简化集合操作,并探讨了高级函数的定义、使用及匿名方法的应用。深入剖析了高阶函数内部机制,以帮助开发者理解并运用这一强大的编程特性。
百度 为了今天的这个活动展示,我们团队准备好久了,今天成功演出,我们都很开心姐妹舞蹈队的成员称,他们聚集在一起跳舞,更多的是为了娱乐跟分享快乐生活。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Scala有一个先Java推出的快捷编写格式,就是高阶方法,也叫高阶函数。本质是将一个方法当做参数传入另一个方法中,常见的是匿名方法

举个例子,用Java的话想要过滤出一个集合中的东西,常见的是写一个循环或者stream流处理,当然stream在大数据集或者复杂场景中会有风险所以很少用。而在Scala中你可以写如下的代码,传入一个匿名函数

package com.wy

object CollectionTest {

  def main(args: Array[String]): Unit = {
    //数据集合
    var mymap = Map("book"->5,"pen"->2,"chizi"->6)

    //tmp=>(tmp._2>=5) 一个匿名方法
    //val filter: Map[String, Int] = mymap.filter(tmp=>(tmp._2>=5))
    //缩写格式
    val filter: Map[String, Int] = mymap.filter(_._2>=5)
    println(filter)

    //用来map也可以
    val mapreuslt: Map[String, Int] = mymap.map(tmp => tmp._1->tmp._2*2)
    println(mapreuslt)

    //用来便利也行
    val forechresult: Unit = mymap.foreach(tmp => println(tmp._1+"的值是:"+tmp._2))
  }
}

除了map、foreach等等,这些常见的架构自带的高级函数,我们也可以自定义自己的。例如当前有如下方法

def p(f: Int => String, v: Int){
	println(v)
}

首先不看参数,那么p方法其实就是一个接受两个参数,内部打印的普通方法。使它成为高阶方法的是f: Int => String这个参数方法表达式,也是高级方法接受其他方法的格式,下面简称参数方法

f: Int => String

f是参数方法的形参名字,按需自定义即可,Int指的是这个方法有一个Int型参数,=> String表示返回值是String,当然如果参数不止一个那么定义的时候,参数方法的参数位要用小括号包裹参数,比如

f: (Int,Float) => String

当你需要传入该类型参数时,只需要按照格式定义即可,比如

val fun=(x:Int)=>{x+"---"}
//单参数或者方法体代码只有一个或者一行时括号和花括号都可以看情况省略
//如果写的时候在赋值上报错,这是scala jdk版本影响,用一个括号包裹匿名方法就可以赋值了

为了方便使用我将它赋值给了常量fun,下面我们来使用它

package com.dtdream.driver

object TTT {
  def main(args: Array[String]): Unit = {
    //1、一个匿名方法,作用是拼接之后返回
    val fun=(x:Int)=>{x+"高阶函数内部拼接"}
    //2、上面的方法做参 调用高阶方法
    println(p(fun,21))

  }

  //3、高阶方法  指定返回值是因为要把值返回到main方法中
  def p(fun: Int => String, v: Int):String= {
    //4、实现逻辑
    fun(v)
  }

}

效果:

在这里插入图片描述
当然,日常开发,不会写上面这样繁琐的代码,就拿我这个例子来说,其实完全可以不用显示的写那个匿名方法的定义,直接在调用高阶函数的时候写成如下格式

	//平常的写法写
    println(p(_+"高阶函数内部拼接",21))
    //完整的写法
    println(p(m=>{m+"高阶函数内部拼接"},21))

上面是最基础的高阶方法概念,在具体的开发中会有很多有意思的写法,但是核心的概念的不会变。比如如果你看过Spark的源码,你会发现SparkSQL的逻辑执行数生成源码中有如下的代码

  protected def parse[T](command: String)(toResult: SqlBaseParser => T): T = {
    logDebug(s"Parsing command: $command")

    val lexer = new SqlBaseLexer(new UpperCaseCharStream(CharStreams.fromString(command)))
    lexer.removeErrorListeners()
    lexer.addErrorListener(ParseErrorListener)

    val tokenStream = new CommonTokenStream(lexer)
    val parser = new SqlBaseParser(tokenStream)
    parser.addParseListener(PostProcessor)
    parser.addParseListener(UnclosedCommentProcessor(command, tokenStream))
    parser.removeErrorListeners()
    parser.addErrorListener(ParseErrorListener)
    parser.legacy_setops_precedence_enabled = conf.setOpsPrecedenceEnforced
    parser.legacy_exponent_literal_as_decimal_enabled = conf.exponentLiteralAsDecimalEnabled
    parser.SQL_standard_keyword_behavior = conf.ansiEnabled

    try {
      try {
        // first, try parsing with potentially faster SLL mode
        parser.getInterpreter.setPredictionMode(PredictionMode.SLL)
        toResult(parser)
      }
      catch {
        case e: ParseCancellationException =>
          // if we fail, parse with LL mode
          tokenStream.seek(0) // rewind input stream
          parser.reset()

          // Try Again.
          parser.getInterpreter.setPredictionMode(PredictionMode.LL)
          toResult(parser)
      }
    }
    catch {
      case e: ParseException if e.command.isDefined =>
        throw e
      case e: ParseException =>
        throw e.withCommand(command)
      case e: AnalysisException =>
        val position = Origin(e.line, e.startPosition)
        throw new ParseException(Option(command), e.message, position, position,
          e.errorClass, e.messageParameters)
    }
  }

  override def parseDataType(sqlText: String): DataType = parse(sqlText) { parser =>
    astBuilder.visitSingleDataType(parser.singleDataType())
  }

这个源码你看不懂没关系,我给你拆解成一个最简单的例子你就明白了

package com.duxiaoman.wangyang.datav

object Test2 {

  /**
   *  f1 方法返回一个字符串,这个字符串由 s2 入参的函数来处理
   * @param s1 一个普通的字符串
   * @param s2 一个高阶方法,形参String,返回值也是String
   * @return 返回String类型数据
   */
  def f1(s1:String)(s2:String => String):String={
    s2(s1)
  }

  /**
   * f2 方法调用 f1 方法将自身的 nr 入参作为 f1 方法的第一个参数
   * @param nr 调用时的入参
   * @param {nr1 => nr1} 这个就是一个匿名方法 ,日常习惯用括号,但是用花括号也可以,而且支持多行代码
   * @return
   */
  def f2(nr: String): String = f1(nr){nr1 => nr1}

  def main(args: Array[String]): Unit = {
    println(f2("main方法入参"))
  }
}

他为什么怎么写呢?是因为上面的Spark的源码中,维护团队需要让parse能支持其他parse*的方法多态,说白了parse就是核心逻辑,但是把一个复杂逻辑的方法以普通参数方法的格式定义,会导致放不下,从而使得代码不好运维,所以parse方法用了柯里化,因此有了parse*方法后面的 {parse => 方法体}这种格式。当然柯里化本身不能用来省略高阶方法,会有编译检测报错,所以大家如果仿写这种格式的时候要注意,不要邯郸学步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
丹毒病是什么原因引起的 食管鳞状上皮增生是什么意思 三句半是什么意思 糖类抗原125偏高说明什么 legion什么牌子
舌苔发白是什么症状 精虫上脑是什么意思 大林木是什么生肖 2018年属什么 herb是什么意思
ca医学上是什么意思 咽炎用什么药好 龟苓膏是什么做的 碳水化合物是什么意思 强化是什么意思
小沈阳名字叫什么 做梦梦见拉屎是什么意思 先兆流产是什么意思 日和立念什么 什么汤是清热去火的
嘴苦嘴臭什么原因liaochangning.com 梦见自己生病了是什么意思hcv9jop7ns1r.cn 出火是什么意思hcv9jop0ns1r.cn 蛤蚧是什么动物hcv9jop2ns6r.cn 纵什么意思hcv7jop6ns1r.cn
风花雪月下一句是什么hcv8jop3ns0r.cn 大脑供血不足吃什么药最好hcv8jop0ns2r.cn 什么叫唐氏综合症hcv9jop4ns3r.cn 梦见毒蛇是什么预兆hcv9jop6ns5r.cn 胃难受想吐是什么原因clwhiglsz.com
12月18是什么星座tiangongnft.com 烟火是什么意思hcv8jop5ns2r.cn 盛夏是什么意思hcv7jop6ns0r.cn sapphire手表什么牌子hcv8jop5ns1r.cn 脉数是什么意思hcv9jop1ns6r.cn
又什么又什么的草地hcv8jop8ns8r.cn 伤口流水是什么原因baiqunet.com 每天早上起来口苦是什么原因hcv7jop5ns0r.cn 肺与什么相表里weuuu.com 回归热是什么病hcv9jop7ns5r.cn
百度