scala中的闭包简单使用

object Closure {

  /**
    * scala中的闭包
    * 函数在变量不处于其有效作用域内,还能够对变量进行访问
    *
    * @param args
    */

  def main(args: Array[String]): Unit = {

    def getHelloFunc(msg:String) = (name:String) => println(msg + "," + name)

    val sayHello = getHelloFunc("hello") // 传入msg的值 ,后面sayHello依然可以访问到
    val sayHi = getHelloFunc("hi")

    // 两次条用getHelloFunc,传入不同的msg,创建不同的函数返回
    // 然而msg只是一个局部变量,
    // 在getHelloFunc调用后,还继续存在创建的函数中,当sayHello("yxj")调用时,值为hello的msg保留在了函数内部,可以反复使用
    // 这种变量超出了其作用域,还可以使用的情况,就是闭包

    // scala

    sayHello("yxj") // 打印 hello,yxj
    sayHi("yxj") // 打印 hi,yxj

  }
}

  

原文地址:https://www.cnblogs.com/yxj0728/p/9281773.html

时间: 2024-08-01 19:37:13

scala中的闭包简单使用的相关文章

scala 中List的简单使用

/** * scala 中List的使用 * */ object ListUse { def main(args: Array[String]): Unit = { def decorator(l:List[Int] , prefix:String){ if(l != Nil) { println(prefix + l.head) decorator(l.tail , prefix) } } // List 是不可变的列表 val list = List(1,2,3,4,5,6,7) decor

第6节 Scala中的高阶函数:1、2、3、

Scala高级特性 1.    课程目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特性,我们通常将可以作为参数传递到方法中的表达式叫做函数.在函数式编程语言中,函数是“头等公民”,高阶函数包含:作为值的函数.匿名函数.闭包.柯里化等等. 2.2.   作为值的函数 可以像任何其他数据类型一样被传递和操作的函数,每当你想要给算法传入具体动作时这个特性就会变得非常有用. 定义函数时格式

(转)Scala中协变(+)、逆变(-)、上界(<:)、下界(>:)简单介绍

看源码的时候看到: trait ExtensionId[T <: Extension] { 没见过这个符号啊<: Scala上界(<:)和下界(>:) 1) U >: T 这是类型下界的定义,也就是U必须是类型T的父类(或本身,自己也可以认为是自己的父类). 2) S <: T 这是类型上界的定义,也就是S必须是类型T的子类(或本身,自己也可以认为是自己的子类). 然后scala中的泛型符号是[T],而不是Java中的<T>. 对于一个带类型参数的类型,比如

Scala中的柯里化

一.初识Currying柯里化 柯里化(Currying)技术 Christopher Strachey 以逻辑学家 Haskell Curry 命名的(尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的).它是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术. 简单理解就是改变函数的表达形式但其功能特性不变,这对于第一次接触柯里化的人来讲,这样的一个技术貌似有点“鸡肋”,但如果你有丰富的JS

Scala 中的异步事件处理

在任何并发性应用程序中,异步事件处理都至关重要.无论事件的来源是什么(不同的计算任务.I/O 操作或与外部系统的交互),您的代码都必须跟踪事件,协调为响应它们而执行的操作.应用程序可以采用两种基本方法之一来实现异步事件处理: 阻塞:一个等待事件的协调线程. 非阻塞:事件向应用程序生成某种形式的通知,而没有线程显式等待它. 合成事件 scala.concurrent.Promise 和 scala.concurrent.Future 类为 Scala 开发人员提供了一些与 Java 8 开发人员的

Algebraic Data Type 及其在 Haskell 和 Scala 中的表现

http://songkun.me/2018/07/12/2018-07-12-adt-in-haskell-and-scala/ 函数式编程接触久了以后,我们会发现很多 FP 语言(这里指静态 FP 语言)具有不少类似的语言特性,这非常自然,因为语言特性就那么多,好用.实用的特性更少,这一方面造成了语言之间的同质化,另一方面也减轻了我们语言切换的成本,算是有利也有弊吧. 常见的静态函数式语言有 Haskell.Standard ML.OCaml.Scala 等,它们之间非常类似,共有的特性有:

js中的闭包

对于没有接触过闭包的初学者来说,很难见名知义马上理解什么是闭包.所以首先我们要明确一下什么是闭包.我们先来看一下官方对于闭包的解释:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.看了这个官方的解释,大家对于闭包理解了吗?反正当我看到这个解释的时候是一脸蒙逼,不知道这说的是些什么鬼.因为看到这个解释我很难把闭包和我平时在js中进行的一些操作联系到一起更谈不上学会应用闭包了.可以说闭包是js中的一个难点,难就难在它很

scala学习手记2 - scala中的循环

先来看一段Java中的循环: for (int i = 1; i < 4; i++) { System.out.print(i + ","); } 毫无疑问,scala可以让这个循环更加简洁.根据上一节中的内容,没有必要显示指定变量i的类型,我们甚至不需要声明这个变量.其次输出的语句也可以更加简洁一些,在scala中可以直接使用println()这个方法输出字符串.最后scala的循环结构也是非常的轻量级.好了,可以看一下代码了: for (i <- 1 to 3) { p

scala入门教程:scala中的面向对象定义类,构造函数,继承

我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面一行代码就是一个scala类的定义: 首先是关键字class 其后是类名 Point 类名之后的括号中是构造函数的参数列表,这里相当于定义了对象的两个常量,其名称分别为x,y,类型都是Int 上面的类和下面的类是一致的,不过更精简了. class Point (xArg:Int, yArg:Int)