14.7 闭包

闭包是函数式编程中的一个比较重要的概念.

很多时候你没有意识到他的存在, 但是他确确实实在为我们工作.

14.7.1 什么是闭包

闭包就是一个函数和与其相关的引用环境(变量)组合的一个整体(实体)

如果一个函数访问了外部函数的局部变量, 那么就可以把这个函数看成一个闭包.
// 这个函数就会返回一个闭包
def foo():()=>Int = {
  var a = 10
  () => a += 10; a  // 返回值为这个闭包
}

14.7.2 使用闭包

object ClosureDemo1 {
  def main(args: Array[String]): Unit = {
    // 获取一个闭包
    val f1 = foo()

    println(f1())
    println(f1())

    // 又一闭包. 每个闭包都有自己的环境的值, 所以这个闭包的a又从10开始了
    val f2 = foo()
    println(f2())
    println(f2())

  }


  def foo() = {
    var a = 10
    () => a += 10; a
  }
}


14.7.3 闭包最佳实践

需求:

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

  2. 调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg , 如果已经有.jpg后缀,则返回原文件名。

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

package com.atguigu.day12

object ClosureDemo2 {
  def main(args: Array[String]): Unit = {
    val fun: String => String = makeSuffix("avi")
    println(fun("hadoop视频"))
    println(fun("scala视频"))
    println(fun("苍老师视频.avi"))
  }


  def makeSuffix(suffix: String): String => String = {
    fileName => if (fileName.endsWith(suffix)) fileName else fileName + "." + suffix
  }
}

14.7.4 体会闭包的好处

  1. 返回的匿名函数和 makeSuffix (suffix string)suffix 变量 组合成一个闭包,因为 返回的函数引用到suffix这个变量

  2. 我们体会一下闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如 .avi

  3. 而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。大家可以仔细的体会一把!

Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-12-13 19:48:51

results matching ""

    No results matching ""