函数的类型和值

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】匿名函数和闭包的更多相关文章

  1. JavaScript笔记 第十六章 匿名函数和闭包

    1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数 //普通函数 function getName() { return 'name'; } a ...

  2. 第一百一十节,JavaScript匿名函数和闭包

    JavaScript匿名函数和闭包 学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂 ...

  3. JavaScript(第十五天)【匿名函数和闭包】

      学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂.(所需基础15章的时候已经声明 ...

  4. 从匿名函数(闭包特性)到 PHP 设计模式之容器模式

    匿名函数(匿名函数) 匿名函数,也叫闭包函数,它允许临时创建一个没有指定名称的函数,常用作回调函数参数的值,也可以作为变量的值来使用.具体的使用见以下示例代码: /* 示例一:声明一个简单匿名函数,并 ...

  5. php的匿名函数和闭包函数

    php的匿名函数和闭包函数 tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use 引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因 ...

  6. js匿名函数和闭包总结

    js匿名函数和闭包总结 一.总结 一句话总结:匿名函数的最主要作用是创建闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁.内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕.闭包可以用 ...

  7. 匿名函数、闭包、lambda表达式、Block

    C#有lambda.匿名函数,js有匿名函数.闭包,OC中有block,看到这是不是心中有一万个草泥马在跑,不过它们这些都是换汤不换药,不同语言名字不一样. 从功能性上说lambda和closure( ...

  8. Golang之匿名函数和闭包

    Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用. 使用方法如下: main.go package main import ( "fmt" ) func main() { ...

  9. js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)

    js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题) 一.总结 需要好好看下面代码 本质是因为匿名函数用到了循环中的变量,而普通方式访问的话,匿名函数的访问在循环之后,所以得到的i是循环 ...

  10. javascript进阶课程--第三章--匿名函数和闭包

    javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...

随机推荐

  1. Python(数据库安装与基本语句)

    一.数据库相关概念 1.两种硬件扩展方式 a.垂直扩展:针对一台计算机 b.水平扩展:多台普通计算机 2.数据库相关概念 数据库服务器(本质就是一个台计算机,该计算机之上安装有数据库管理软件的服务端) ...

  2. jquery补充

  3. N多条短信,用什么算法从中找出相似内容的来?

    创建树,每个字符为一个节点,对于同一位置字符相同的共用一个节点.最后找出具有公共节点的短信.例如:MessageA "hello,world"MessageB "hell ...

  4. corethink功能模块探索开发(十四)后台编辑按钮

    效果图: 1.添加下图55&58行代码 2.实现edit方法 位于Equip/Admin/DeviceRepaireAdmin.class.php中 public function edit( ...

  5. Rest_framework-3

    目录: 返回值的封装 分页 视图 路由 渲染器 一 返回值的封装 a. API的基本框架 setting: 1 首先注册rest_framework 2 版本配置 REST_FRAMEWORK = { ...

  6. ipv6被拒的解决方法

    A,检测服务器是否支持ipv6连接 用mac 搭建IPv6环境测试,只能测试客户端到mac这段网络正常,但是mac到服务器还是IPv4的,所以没有办法测试服务器的IPv6是否正常.可以用手机打开2)步 ...

  7. HDU - 6437 Problem L.Videos 2018 Multi-University Training Contest 10 (最小费用最大流)

    题意:M个影片,其属性有开始时间S,结束时间T,类型op和权值val.有K个人,每个人可以看若干个时间不相交的影片,其获得的收益是这个影片的权值val,但如果观看的影片相邻为相同的属性,那么收益要减少 ...

  8. hadoop08---读写锁

    ReentrantLock 直接使用lock接口的话,我们需要实现很多方法,不太方便,ReentrantLock是唯一实现了Lock接口的类,并且ReentrantLock提供了更多的方法,Reen ...

  9. Android震动vibrator(马达)--系统到驱动的流程【转】

    本文转载自:https://blog.csdn.net/tianshiyalin/article/details/17136723 一.前言 本人刚学习安卓驱动开发,水平不能说菜,是根本没有水平,在这 ...

  10. [mongodb] MMAP 和wiredTiger 的比较

    mongodb 现在有两款存储引擎  MMAPv1 和 WireTiger,当然了除了这两款存储引擎还有其他的存储引擎了. 如: 内存引擎:现在的mongodb 版本中已经有了,主要的cache 服务 ...