【scala】匿名函数和闭包
函数的类型和值
Scala是一种纯面向对象的语言,每个值都是对象。Java是一种不全面向对象的语言。
Scala也是一种函数式语言,其函数也能当成值来使用。Java则是指令试编程。
但是Scala同时支持指令试编程和函数式编程,是两种编程方式的结合的一门语言。
在Scala中,我们可以把函数当作一个数据类型,可以像任何其他数据类型一样被传递和操作。这体现了函数式编程的核心。
我们可以像定义变量的那样去定义一个函数,因此,函数也就会和其他变量一样拥有类型和值。
我们看个例子
- def counter( value:Int ) : Int = { value + 1 }
我们定义了一个counter函数,参数为Int类型的value,返回值为Int类型,大小为value+1。
counter函数的类型为 ( Int ) => Int
箭头前,圆括号里面的为参数的类型,有多个参数依次写到圆括号中即可,(Int,String)。
当只有一个参数的时候可以省略圆括号 Int => Int
箭头后,为返回值类型
counter函数的值为(value) => { value + 1}
箭头前,圆括号里面的为参数的值,多个参数依次写到圆括号中即可。我们可以在这里定义参数类型,(value:Int)=>{value+1}
箭头后,大括号里面为返回的值,当只有一条语句的时候可以省略掉大括号。(value)=> value + 1
我们知道了函数的类型和值,试试定义一个函数变量。
- val num : Int = 5;
- //我们照着这个例子完成函数变量的定义
- val counter :(Int)=> Int = { (value) => {value+1} }
使用函数变量
- println( counter(1) )
匿名函数
当一个函数就只用一次,我们就不需要给函数命名,这时我们就可以使用匿名函数。
我们通常把匿名函数称为“Lambda表达式”。
格式如下:(参数) => 表达式 //如果参数只有一个,圆括号可以省略
示例
- (num:Int) => num*2
我们可以直接把匿名函数放到变量中
- val myNum :(Int) => Int = (num:Int) => num *2
- //这里的形式和上面定义函数变量是一样的,只有一条语句的时候可以省略{}
- //我们可以省略掉返回类型让语言自己判断,但是需要添加传入参数的类型
- val myNum = (num:Int) => num*2
- println(myNum(1)) //使用函数变量
我们需要注意,虽然Scala语言有自动推断类型机制,但是我们不能全部省略,需要有部分类型确定才能推断出省略的部分类型。
闭包
闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。
- val myNum = (num:Int) => num*2 //普通函数
- val myNum = (num:Int) => num*a //闭包,a为变量
我们看到闭包和普通函数的区别,闭包函数的返回值不仅根据参数num来确定,还依赖于外部的变量a
我们不能在没有定义变量a之前定义这个闭包,会提示not found value a。
正确定义闭包函数的方式
- scala> var a = 10
- a: Int = 10
- scala> val myNum = (num:Int) => num*a //定义闭包函数前依赖的变量必须有值
- myNum: Int => Int = $$Lambda$1050/1792172929@4b20aa21
- scala> myNum(10)
- res2: Int = 100
- scala> a = 20 //当我们修改外部的a的变量值,闭包函数的返回值也跟着变化,创建出一个新的闭包
- a: Int = 20
- scala> myNum(10)
- res3: Int = 200
【scala】匿名函数和闭包的更多相关文章
- JavaScript笔记 第十六章 匿名函数和闭包
1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数 //普通函数 function getName() { return 'name'; } a ...
- 第一百一十节,JavaScript匿名函数和闭包
JavaScript匿名函数和闭包 学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂 ...
- JavaScript(第十五天)【匿名函数和闭包】
学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂.(所需基础15章的时候已经声明 ...
- 从匿名函数(闭包特性)到 PHP 设计模式之容器模式
匿名函数(匿名函数) 匿名函数,也叫闭包函数,它允许临时创建一个没有指定名称的函数,常用作回调函数参数的值,也可以作为变量的值来使用.具体的使用见以下示例代码: /* 示例一:声明一个简单匿名函数,并 ...
- php的匿名函数和闭包函数
php的匿名函数和闭包函数 tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use 引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因 ...
- js匿名函数和闭包总结
js匿名函数和闭包总结 一.总结 一句话总结:匿名函数的最主要作用是创建闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁.内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕.闭包可以用 ...
- 匿名函数、闭包、lambda表达式、Block
C#有lambda.匿名函数,js有匿名函数.闭包,OC中有block,看到这是不是心中有一万个草泥马在跑,不过它们这些都是换汤不换药,不同语言名字不一样. 从功能性上说lambda和closure( ...
- Golang之匿名函数和闭包
Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用. 使用方法如下: main.go package main import ( "fmt" ) func main() { ...
- js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)
js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题) 一.总结 需要好好看下面代码 本质是因为匿名函数用到了循环中的变量,而普通方式访问的话,匿名函数的访问在循环之后,所以得到的i是循环 ...
- javascript进阶课程--第三章--匿名函数和闭包
javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...
随机推荐
- python多线程的适用场景
1.多线程对于计算密集型无用 需求:列表li1每个元素加1,列表li2每个元素加100 # 导入模块 import threading li1 = [11, 22, 33] # +1 li2 = [4 ...
- DB2中编目本机其中数据库的方法
问题:同一节点上有两个实例.假设想在当中一个实例下訪问还有一个实例中的数据库,有两种方法: 1. 使用catalog local node的方式,在当中一个实例中将另外一个实例直接编目,这样的方试中, ...
- (4.8)SET ANSI_NULLS ON、SET QUOTED_IDENTIFIER ON
T-SQL支持在与空值进行比较时,允许比较运算符返回 TRUE 或 FALSE. 通过设置 ANSI_NULLS OFF 可将此选项激活.当 ANSI_NULLS 为 OFF 时,如果 ColumnA ...
- ionic学习笔记—常用命令
Ionic CLI介绍 Ionic CLI是开发Ionic应用程序过程中使用的主要工具.它就像一个瑞士军刀:它在一个界面下汇集了大量工具. CLI包含许多对Ionic开发至关重要的命令,例如start ...
- HTML中的SEO和HTML语义化
SEO 1) <title>网站SEO标题</title>, 百度搜索出来的记录, 其标题基本就提取至网站的title, 标签, 因此标题起的好, 不论对点击率还是SEO都至关 ...
- iOS学习之二维码扫描
这几天刚好将本人高仿新浪微博的事情进行一个阶段性的tag,在此也将这个项目在实现二维码扫描这个功能来做一个简要的记录.关于高仿新浪微博的源代码,本人已经将全部代码托管到github,地址在这里.欢迎大 ...
- 关于WinIO.DLL的键盘输入模拟
关于WinIO.DLL的键盘输入模拟 最近在找键盘模拟的方式,最后在网上找到了一个WinIO.DLL的IO键盘模拟按键的方式.但是居然那个方法是有问题的.我造了全局的hook监视键盘信息,发现它只是有 ...
- C++模板专门化与重载
最近在复习C++有关知识,又重新看<<Effective C++>>,收获颇丰.原来以前看这边书,好多地方都是浅尝辄止.<<Effective C++>> ...
- linux命令(6/11)--修改文件的用户组chgrp和文件所有者chown
在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...
- po dto vo bo
DozerBeanMapper是JavaBean的映射工具,可以进行对象之间相同属性名赋值 关于PO.DTO.VO在分层模型之间的关系:首先在持久层由DAO访问数据库将数据对象封装成PO,然后 ...