Scala入门到放弃——高阶函数(八)

十一、高阶函数

scala的函数对象是一种特殊的class,即可担当函数计算职责又可以作为变量传递

作为值的函数

object Function04 {
  def main(args: Array[String]): Unit = {
    val result = sum _ // _ 匹配函数参数列表
    println(result)
  }

  def sum(x: Int, y: Int): Int = x + y
}

作用:

  • 调用
  • 作为参数传递

匿名函数(略)

参考之前

柯里化函数(略)

带函数参数的函数

在这里插入图片描述

object Function05 {
  def main(args: Array[String]): Unit = {
    val f1 = (x: Int, y: Int) => x + y  // 声明匿名函数
    val result = sum(1, 2, f1)
    println(result)  // 3
  }

  def sum(x: Int, y: Int, f: (Int, Int) => Int) = {  // 带函数参数的函数 函数作为值传递
    f(x, y)
  }
}

参数(类型)推断

// 方式1 
val a1 = Array(1, 2, 3, 4)
val f2 = (x: Int) =>  println(x)
// foreach 遍历方法 参数需要一个函数对象
a1.foreach(f2)

// 方式2
a1.foreach((x) => println(x))  // 函数参数的类型自动推导

// 方式3
a1.foreach(x => println(x)) // 对于只有一个参数的函数,省略参数外围的()

// 方式4
a1.foreach(println(_)) // 参数在 => 右侧出现一次,可以用 _ 替换掉

// 方式5
a1.foreach(println)  // 更为简化的写法

一些有用的高阶函数

  • map 映射方法

    Array(1, 2, 3, 4, 5).map("*" * _).foreach(println _)
    
  • filter 过滤方法

    (1 to 10).filter(_ % 2 == 0).foreach(println)
    
  • reduceLeft 从左计算

    (1 to 10).filter(_ % 2 == 0).reduceLeft((x,y) => x+y) // 30
    
  • WordCount(单词计数)

    val a1 = Array("Hello Scala", "Hello Hadoop", "Hello Hello Hello")
    a1.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).map(x => (x._1, x._2.length)).foreach(println)
    

函数闭包

闭包指在函数体内,可以访问相应作用域内的任何变量,因为它引用到函数外面定义的变量,定义这个函数的过程是将这个自由变量捕获而构成一个封闭的函数。

语法:函数 + 外部变量 = 闭包

如:

var num = 1  // 外部变量
val result = (x: Int) => num + x // 匿名函数引用外部变量,闭包后 多次调用 共享相同的外部变量
println(result(1)) // 1
num += 10
println(result(1)) // 12
// f1 按道理来说 函数对象不能够使用当前类的声明变量
// 函数闭包:可以将当前外部变量 闭包到函数对象中  语法: 函数对象 + 外部变量 = 闭包
// 外部变量是一个共享变量,一旦外部变量值发生变化  会影响到函数对象中的内容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值