匿名函数

匿名函数没有名字,它很大程度上和 lambda 表达式类似,它的函数体既可以是语句块,又可以是表达式。同时,匿名函数的参数类型可以推断而不用指定,这点跟普通的函数不同。此外,匿名函数只能定义在函数体内。

fun main(args:Array<String>){fun(x:Int y:Int) = x+y // 1val arr = arrayOf("hello","world","!")arr.filter(fun(item): Boolean = item.length > 3) // 2.forEach(fun(item){ println(item)}) // 3
}
  1. 匿名函数,使用表达式作为函数体。这种匿名函数无法正常调用。
  2. 传递一个匿名函数给 filter 作为参数,注意匿名函数的写法比 lambda 表达式要繁琐。如果匿名函数的函数体是表达式,那么匿名函数的返回值可以推断。因此这里的 Boolean 不是必须的。
  3. 用语句块作为匿名函数的函数体。

和 lambda 表达式不同,匿名函数中如果不使用全限定的 return 的话,返回的是匿名函数本身,而非外部函数。

在 kotlin 中,由于 lambda 的写法更简单,所以一般都会用 lambda 表达式代替匿名函数。可以简单地将二者视作等价物,我们可以用匿名函数`一词来指代 lambda 表达式。

闭包

lambda 表达式和匿名函数可以访问和修改其外层变量的。这些变量和lambda/匿名函数就构成了一个闭包。

带接收者的函数字面值

kotlin 在定义一个函数时,可以指定这个函数归属于哪个类(接收者)。在函数内部,你可以调用接收者的实例所拥有的方法,这有点类似于扩展函数。

fun main(args: Array<String>){val substract: Int.(other:Int)->Int = {other->this-other} // 1println(123.substract(3)) // 2
}
  1. substract 是一个函数类型。Int. 指定了一个 Int 类型作为接收者。后面的内容则是函数字面值,也就是 substract 函数的签名(参数、返回值)和函数体。函数体中调用了一个 lambda表达式,other 是入参,this 是接收者自身。
  2. 通过一个 Int 实例 123 来调用这个函数。这里 123 就变成了接收者。

函数的字面值除了使用 lambda 表达式以外(如上面),我们也可以使用匿名函数(如下面):

    val sum = fun Int.(other: Int): Int = this+other // 1println(123.sum(2)) // 2
  1. 使用匿名函数作为函数字面量,和 lambda 表达式相比,多了一个 fun 关键字,少了一个 -> 符号和大括号。这句也可以写成:

    val sum = fun Int.(other: Int): Int{ this+other } // 表达式换成语句块
    
  2. 调用方式一样。

带接收者的函数=不带接收者的函数

在 kotlin 的函数中,带接收者的函数和不带接收者的函数中某种情况下是等价的,二者可以互相替换,比如:

String.(Int) -> Boolean

这是一个带接收者(String)的匿名函数(lambda),它定义了一个带 Int 参数和 Boolean 返回值的函数(lambda)。它实际上可以转换为:

(String, Int) -> Boolean

即将接收者作为第一个参数。我们可以把后者看作是前者的等价物,反之亦可。看如下例子:

val myEquals:String.(Int)->Boolean = { param->toIntOrNull() == param} // 1
println("456".myEquals(456)) // true
fun test(op:(String, Int)->Boolean, a:String, b:Int, c:Boolean)=println(op(a,b)==c) // 2
test(myEquals,"200",200,true) // 3
val equals:(String, Int)->Boolean = { string, int -> string.toIntOrNull() == int} // 4
test(equals, "200",200, true)
  1. 这里定义了一个“带接收者的函数” myEquals,它定义了一个接收者 String,接收一个 Int 参数,返回 Boolean。
  2. 函数 test 的第一个参数也是一个函数,而且是不带接收者的函数,它定义了两个参数:一个 String 和一个 Int,同样返回 Boolean。
  3. 因此,它们刚好是一个”带接收者函数“及其”不带接收者的版本“的例子。因此调用 test 函数时,第一个参数可以用”带接收者版本“。
  4. 当然,也可以用”不带接收者版本“。

从上面的例子看出,带接收者函数传递的参数更少,因而书写更加简便。

【深入kotlin】 - 匿名函数、闭包和接收者相关推荐

  1. 匿名函数 闭包 ( 7 章 )

    1: function functionName(arg0,arg1){ 2: 3: 4: 5: } 6: 7: var functionName = function( arg0 , arg1 ){ ...

  2. php里面用魔术方法和匿名函数闭包函数动态的给类里面添加方法

    1.认识  __set  (在给不可访问属性赋值时,__set() 会被调用) 也就是说你再访问一个类里面没有的属性,会出发这个方法 class A{private $aa = '11';public ...

  3. php : 匿名函数(闭包) [一]

    摘自: http://www.cnblogs.com/starlion/p/3894578.html 一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous fu ...

  4. PHP匿名函数 闭包 Use用法

    匿名函数是闭包的核心,匿名函数在PHP里实际上是一个Closure类的对象(请注意是对象).与普通的面向对象编程方式不同,匿名函数的代码是直接写在调用处的,不需要额外写一个类,编写方法的代码.这样的好 ...

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

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

  6. Go语言中的匿名函数和闭包的样子

    1). 函数也是值,可以像普通值那样,传来传去: 2). 匿名函数: 3). 函数的类型,类似于:func(float64,float64) float64 ===================== ...

  7. JavaScript 匿名函数与闭包

    匿名函数与闭包 匿名函数 闭包 概念 相关知识点 闭包中的this 循环函数中的匿名函数和闭包 循环函数中的匿名函数 循环函数中的闭包 模仿块级作用域 私有变量 静态私有变量 匿名函数 没有函数名的函 ...

  8. 深入理解Java Lambda表达式,匿名函数,闭包

    前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...

  9. php 代码修改后 重新实例化_从匿名函数到PHP设计模式之容器模式

    点击蓝字关注我们!每天获取最新的编程小知识! 源 / php中文网      源 / www.php.cn 从匿名函数(闭包特性)到 PHP 设计模式之容器模式 (查看原文请点击本文末尾左下角: 匿名 ...

  10. 专科 java转go 翱翔之路(一)基础语法:变量声明,匿名函数,结构体,函数,map

    本人专科!在太原干了一年了,想从java转go,上班中自学go,明年找go语言相关的工作 立帖为证! 待羽翼丰满,大风到来,便是我翱翔之时!!! 1.Go语言 1.命令 1.1 查看版本号 go ve ...

最新文章

  1. 【原创】完美实现GetProcAddress [文字模式]
  2. 阻止表中出现重复项——SQL UNIQUE 约束
  3. RESET MASTER和RESET SLAVE使用场景和说明,以及清除主从同步关系
  4. 《数据库原理与应用》(第三版) 第4章SQL Server 2012基础 习题参考答案
  5. scikit-learning_特征分析(数据挖掘入门与实践-实验7)
  6. c++ template(9)trait和Policy
  7. Android 拍照、从相册选择图片
  8. Android培训翻译_允许其他应用程序启动你的Activity
  9. HDU 1964 Pipes
  10. opencv python轻松入门_OpenCV轻松入门 面向Python
  11. 在图片中选定任意凸多边形制作掩膜程序MATLAB
  12. ASP.NET中的两个Cookie类:HttpCookie类与Cookie类
  13. linux cat 筛选文件夹,Linux 基础命令 -- cat、sort、uniq、wc、head、tail、tee
  14. 深入浅出,教你一步步实现数据分析入门、进阶
  15. 达索系统成立“大土木工程达索系统BIM技术推进联盟”深化应用、共享经验
  16. Centos7---1708 Linux上安装ZooKeeper 以及JDK1.8安装
  17. yousa_team团队项目——兼职平台网站 工作进度
  18. 阿里云技术天团空降CSDN独家在线峰会,揭秘核心竞争力
  19. cck8graphpad作图_北京cck8数据作图「上海儒安生物科技供应」
  20. Java幸运盒子代码_幸运盒子扭蛋机小程序app开发

热门文章

  1. 谁将是互联网宝宝军团的最大劲敌?
  2. 【PA2011】Kangaroos
  3. 牛客网面试提错题集(1)
  4. Millet谷仓,揭秘你所不知道的区块链电商
  5. MFC 解压7z文件
  6. 星巴克中国咖啡创新产业园正式动工,追加项目总投资至近11亿元
  7. nginx reopen
  8. 2013年春节前订票经历及经验分享
  9. 互联网人用什么软件画出大神级别的架构图?如何画出顶级架构图?
  10. 【软件测试】软件测试职业规划