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

scala基础学习-闭包

文章目录

  • scala闭包
    • 闭包
    • 闭包使用内置变量
    • 闭包的返回值
    • 闭包与函数式编程

scala闭包

闭包

在 Scala 中,闭包是一个函数,它捕获了外部函数作用域中的变量。闭包可以访问并操作这些外部变量,即使外部函数已经执行完毕。闭包通常用于实现高阶函数、函数柯里化和其他函数式编程技术。

在 Scala 中,虽然可以在一个方法内部定义另一个方法(嵌套方法),但这种做法并不像在 Python 中那样常见。Scala 更倾向于使用函数字面量和匿名函数来实现闭包和高阶函数的功能。

以下是一个闭包的简单示例:

//: Int=>Int  证明返回值是一个函数,表达式
def makeMultiplier(factor: Int): Int => Int = {
  (x: Int) => factor * x
}

val timesTwo = makeMultiplier(2)
val timesThree = makeMultiplier(3)

println(timesTwo(5))  // 输出 10
println(timesThree(5)) // 输出 15


在这个例子中,makeMultiplier 函数接受一个整数 factor 作为参数,并返回一个新的函数,这个新函数接受一个整数 x 并返回 factor * x。返回的函数是一个闭包,因为它捕获了 factor 变量。

即使 makeMultiplier 函数已经执行完毕,返回的函数仍然可以访问 factor 变量。因此,timesTwotimesThree 这两个闭包可以分别使用不同的 factor 值。

闭包使用内置变量

object ClosureExample3 {
  def main(args: Array[String]): Unit = {
    var messages = List("Hello", "World")
	// 表达式为 messages = messages :+ msg  :+ 为列表追加
    val addMessage = (msg: String) => messages = messages :+ msg

    addMessage("Scala")
    println(messages)  // 输出 List(Hello, World, Scala)
      
    // 使用内部变量
    val factor = 8
    def makeMultiplier1() = {
      (x: Int) => factor * x
    }
	val one1 = makeMultiplier1()
    println(one1(2)) // 16

	}

}

内部变量的使用,使用闭包可以固定变量,不受变量更改而变化

//传入变量,但是调用会随着变量的更改而修改    
	var factor = 8
    def makeMultiplier1() = {
      (x: Int) => factor * x
    }

    val one1 = makeMultiplier1()
    println(one1(2)) //输出16

    factor = 9
    println(makeMultiplier1()(2)) //输出18

//使用闭包固定变量,不受变量更改而变化
    factor = 10
    def makeMultiplier(factor: Int) = {
      (x: Int) => factor * x
    }
	
	// one 接受了makeMultiplier(factor) 闭包已经固定,one 已经不在受factor变量影响了
    val one = makeMultiplier(factor)
    println(one(2)) //输出20

    factor = 11
    println(one(2)) //输出20

闭包的返回值

闭包返回函数

// Int => Int 表明返回对象为函数 返回表达式 (x: Int) => x + adder
def makeAdder(adder: Int): Int => Int = {
  (x: Int) => x + adder
}

//相当于val addFive = (x: Int) => x + 5
val addFive = makeAdder(5)
val addTen = makeAdder(10)

闭包与函数式编程

object ClosureExample4 {
  def main(args: Array[String]): Unit = {
      
    // 返回了一个调用结果在highOrderFunction内部直接调用f函数
    def highOrderFunction(f: Int => Int, x: Int): Int = f(x)
    val externalVar = 5
    val closure = (x: Int) => x + externalVar
    println(highOrderFunction(closure, 10))  // 输出 15
    // 相当于highOrderFunction
    println(closure(10))
  }
}

在函数式编程中,闭包经常与高阶函数一起使用。高阶函数可以接受闭包作为参数,这允许你传递具有特定行为的函数。以下是一个使用高阶函数和闭包的例子:

def operateOnList(list: List[Int], operation: Int => Int): List[Int] = {
  list.map(operation)
}
val addFive = (x: Int) => x + 5
val result = operateOnList(List(1, 2, 3), addFive)
println(result) // 输出 List(6, 7, 8)

在这个例子中,operateOnList 是一个高阶函数,它接受一个整数列表和一个操作函数作为参数。addFive 是一个闭包,它捕获了外部作用域中的变量(在这个例子中没有捕获任何变量,但它是潜在的闭包)。operateOnList 函数使用 addFive 函数对列表中的每个元素进行操作。

总之,在 Scala 中,闭包和函数式编程是紧密相关的概念。闭包允许你创建可以捕获和操作外部状态的函数,而函数式编程强调使用纯函数、高阶函数和不可变数据来创建可预测和模块化的代码。通过结合使用闭包和函数式编程,你可以创建强大和灵活的代码,这些代码易于理解和维护。


http://www.kler.cn/a/565729.html

相关文章:

  • Qt融合一个服务端连接多个客服端和一个客户端连接多个服务端程序
  • django.core.exceptions.ValidationError
  • 初创公司的域名用什么样的好?
  • 探索 Hutool - JSON:高效的 JSON 处理利器
  • java流程控制(Scanner Random swich 分支语句 循环语句)
  • java后端开发day23--面向对象进阶(四)--抽象类、接口、内部类
  • 超市里的货物价调整
  • 自然语言处理NLP入门 -- 第六节命名实体识别
  • C++20新特性:`[[no_unique_address]]`、`[[likely]]`和`[[unlikely]]`的探索与
  • 【新手入门】SQL注入之DNSlog注入
  • JavaScript 系列之:垃圾回收机制
  • RabbitMQ 的介绍与使用
  • 降维攻击!PCA与随机投影优化高维KNN
  • DeepSeek 开源狂欢周(二)DeepEP深度技术解析 | 解锁 MoE 模型并行加速
  • 双向冒泡排序算法
  • 模型的在线量化和离线量化
  • 深入理解分布式系统中的关键概念:三阶段提交、补偿事务、消息队列与Saga事务模型及分布式ID生成方案
  • Qt 中实现两个 QTableView 同步高亮与滚动的方案
  • 每日学习Java之一万个为什么?[MySQL面试篇]
  • 内容中台实战指南:效能提升与体系构建