Kotlin语法(函数和lambda表达式)

三、函数和lambda表达式

1. 函数声明

fun double(x: Int): Int {

}

函数参数是用 Pascal 符号定义的 name:type。参数之间用逗号隔开,每个参数必须指明类型。函数参数可以有默认参数。这样相比其他语言可以减少重载。

fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size() ) {
...
}

2. 命名参数

在调用函数时可以参数可以命名。这对于有很多参数或只有一个的函数来说很方便。

fun reformat(str: String, normalizeCase: Boolean = true,upperCaseFirstLetter: Boolean = true,
             divideByCamelHumps: Boolean = false,
             wordSeparator: Char = ' ') {
...
}
reformat(str,
    normalizeCase = true,
    uppercaseFirstLetter = true,
    divideByCamelHumps = false,
    wordSeparator = '_'
  )

3. 变长参数:

fun asList<T>(vararg ts: T): List<T> {
    val result = ArrayList<T>()
    for (t in ts)
        result.add(t)
    return result
}

传递一个 array 的内容给函数,我们就可以使用 * 前缀操作符:

val a = array(1, 2, 3)
val list = asList(-1, 0, *a, 4)

Kotlin 中可以在文件个根级声明函数,这就意味者你不用创建一个类来持有函数。除了顶级函数,Kotlin 函数可以声明为局部的,作为成员函数或扩展函数。
Kotlin 支持局部函数,比如在另一个函数使用另一函数。局部函数可以访问外部函数的局部变量(比如闭包)。局部函数甚至可以返回到外部函数

4. 高阶函数

高阶函数就是可以接受函数作为参数并返回一个函数的函数。比如 lock() 就是一个很好的例子,它接收一个 lock 对象和一个函数,运行函数并释放 lock;

fun lock<T>(lock: Lock, body: () -> T ) : T {
    lock.lock()
    try {
        return body()
    }
    finally {
        lock.unlock()
    }
}

其实最方便的办法是传递一个字面函数(通常是 lambda 表达式):

val result = lock(lock, { sharedResource.operation() })

在 kotlin 中有一个约定,如果最后一个参数是函数,可以省略括号:

lock (lock) {
    sharedResource.operation()
}

5. 字面函数

  • 字面函数被包在大括号里
  • 参数在 -> 前面声明(参数类型可以省略)
  • 函数体在 -> 之后

字面函数或函数表达式就是一个 "匿名函数",也就是没有声明的函数,但立即作为表达式传递下去。

6. 函数类型

如:(T, T) -> Boolean
注意如果一个函数接受另一个函数做为最后一个参数,该函数文本参数可以在括号内的参数列表外的传递。

7. 函数文本语法

函数文本的完全写法是下面这样的:

val sum = {x: Int,y: Int -> x + y}

函数文本总是在大括号里包裹着,在完全语法中参数声明是在括号内,类型注解是可选的,函数体是在 -> 之后,像下面这样:

val sum: (Int, Int) -> Int = {x, y -> x+y }

8. 函数表达式

fun(x: Int, y: Int ): Int = x + y

9. 内联函数

在高阶函数前增加inline注解可以指定函数內联。inline 标记即影响函数本身也影响传递进来的 lambda 函数:所有的这些都将被关联到调用点。
内联可能会引起生成代码增长,所以可以使用noinline来指定某些函数不进行內联。

注意有些内联函数可以调用传递进来的 lambda 函数,但不是在函数体,而是在另一个执行的上下文中,比如局部对象或者一个嵌套函数。在这样的情形中,非局部的控制流也不允许在lambda 函数中。为了表明,lambda 参数需要有 InlineOptions.ONLY_LOCAL_RETURN 注解

参考:

  1. http://kotlinlang.org/docs/reference/basic-syntax.html
  2. http://huanglizhuo.gitbooks.io/kotlin-in-chinese
时间: 2024-11-08 22:05:01

Kotlin语法(函数和lambda表达式)的相关文章

【转】【UNITY3D 游戏开发之七】C# 中的委托、事件、匿名函数、LAMBDA 表达式

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/unity3d-game/1613.html       Unity3d 开发中,常用的莫过于委托和事件了,所以转载一篇相关文章,写的比较详细的,这里分享一下.      对于匿名函数以及Lambda表达式也是非常常用的,这里就直接分享链接,童鞋们自行学习.     匿名函数.Lambda表达式:http://www.cnblogs.com/

玩转Kotlin 彻底弄懂Lambda和高阶函数

Lambda是什么 简单来讲,Lambda是一种函数的表示方式(言外之意也就是说一个Lambda表达式等于一个函数).更确切的说:Lambda是一个未声明的函数,会以表达式的形式传递 为什么要用Lambda 设想一下,在Android中实现一个View的点击事件,可以使用如下实现: View view = findViewById(R.id.textView); view.setOnClickListener(new View.OnClickListener() { @Override publ

匿名方法,Lambda表达式,高阶函数

原文:匿名方法,Lambda表达式,高阶函数 匿名方法 c#2.0引入匿名方法,不必创建单独的方法,因此减少了所需的编码系统开销. 常用于将委托和匿名方法关联,例如 1. 使用委托和方法关联: this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);private void btnRefresh_Click(object sender, EventArgs e){    BindData();} 2. 使用委

Lambda 表达式语法

本主题介绍 lambda 表达式的语法. 它演示提供 lambda 表达式的结构元素的示例,这些元素与示例. Lambda 表达式语法 下面用于定义显示语法,ISO C++11 从标准,lambda 表达式 (项标记下标 选择 是可选的):          lambda-introducer lambda-declarator 选择 compound-statement 进一步失败的组件这些语法如下: lambda-introducer:          [ lambda-capture 选

java中lambda表达式语法说明_java

语法说明 一个lambda表达式由如下几个部分组成: 1. 在圆括号中以逗号分隔的形参列表.在CheckPerson.test方法中包含一个参数p,代表了一个Person类的实例.注意:lambda表达式中的参数的类型是可以省略的:此外,如果只有一个参数的话连括号也是可以省略的.比如上一节曾提到的代码: p -> p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25

C++11中的Lambda表达式

"Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数.Lambda表达式可以表示闭包(注意和数学传统意义上的不同). ISO C++ 11 标准的一大亮点是引入Lambda表达式.基本语法如下: [capture list] (parameter list) ->return type { function

Lambda表达式表达式树

在C#3.0中,继匿名方法之后出现了Lambda 表达式,使表达更为简洁.快捷.Lambda 表达式使用Lambda 运算符 "=>"来定义,语法如下: (参数列表) => {方法体} Lambda 运算符的左边是输入参数,定义Lambda表达式的接收参数列表,右边包含表达式或语句块,表示将表达式的值或语句块返回的值传给左边的参数列表. Lambda 表达式是一个匿名函数,可以包含表达式和语句,并且可用于创建委托或表达式目录树类型. 以下部分来自MSDN:点击打开链接 La

让JavaScript拥有类似Lambda表达式编程能力的方法_javascript技巧

但是我后来也跟人说,因为接受的参数太多,所以如果不把智能提示写得很清楚的话,连我自己都常常搞不清楚该怎么用. 不过,接受参数多,除了容易弄错用法以外,还会产生另一个问题,这也是我编写出今天发布的这个东西的原因. 来看一下JS版的页码呈现组件的完全版函数签名: 复制代码 代码如下: function pnView( currentPage, actionCurrent, beginPage, endPage, actionBegin, actionEnd, currentSiblings, act

实例讲解C++编程中lambda表达式的使用_C 语言

函数对象与Lambdas你编写代码时,尤其是使用 STL 算法时,可能会使用函数指针和函数对象来解决问题和执行计算.函数指针和函数对象各有利弊.例如,函数指针具有最低的语法开销,但不保持范围内的状态,函数对象可保持状态,但需要类定义的语法开销. lambda 结合了函数指针和函数对象的优点并避免其缺点.lambda 与函数对象相似的是灵活并且可以保持状态,但不同的是其简洁的语法不需要显式类定义. 使用lambda,相比等效的函数对象代码,您可以写出不太复杂并且不容易出错的代码. 下面的示例比较l