Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

作者:Antonio Leiva

时间:Jan 5, 2017

原文链接:https://antonioleiva.com/lambdas-kotlin/

由于Lambda表达式允许更简单的方式建模式函数,所以它是Kotlin和任何其他现代开发语言的最强工具之一。

在Java6中,我们仅能下面方法这样做:通过用单一方法声明接口,并用匿名对象实现那些接口。

Lambda表达式特别是在Kotlin中能定义的方式,为我们开启无线可能的世界。在接下来的内容中,我们将了解这些用法。

Kotlin的Lambda表达式

Lambda表达式是函数的表示的方式,在解释setOnClickListener时,我们已经见过这个例子:

1 val view = findViewById(R.id.welcomeMessage)
2 view.setOnClickListener { v -> navigateWithView(v) }

如你所见,左边定义函数(在这个例子中时view)的输入值,右边声明函数要实现的操作。

怎样定义接受Lambda表达式的函数

如果我们自己要在Kotlin中定义函数,我们就需要按如下做法:

1 fun setOnClickListener(listener: (view: View) -> Unit){}

由于这个函数通过参数接收一函数,或返回一函数,所以,这是一高阶函数

Kotlin和Java interop

调用这个函数的一般方式可能是如下:

1 view.setOnClickListener({ v -> navigateWithView(v) })

这是我们已经见到这样做的比较简单的方法,而后续我们还能知道它帮助我们做更酷的事。

这是由于如果函数的最后一个参数是函数,我们能够将它从括号中提取出来:

1 view.setOnClickListener(){ v -> navigateWithView(v) }

另外,如果只有一个函数作为参数,我们还能省去括号:

1 view.setOnClickListener { v -> navigateWithView(v) }

DSL创建

这允许我们创建自己的DSL,这能定义微型语言。在Kotlin参考网站有HTML例子,而这里我们要定义一个更简介方法。

假设你要创建在另一个线程上运行的代码块。你可以有一个函数,它接收在后台运行的一个函数:

1 fun doAsync(f: () -> Unit) {
2     Thread({ f() }).start()
3 }

这个函数产生一个线程,它执行Runnable运行作为自变量接受的函数。Runnable是Java中有单一方法的类,在Kotlin中由Lambda表达式替代。

现在,在我们的代码中,产生异步代码块:

1 doAsync {
2     op1()
3     op2()
4     op3()
5 }

这样在{}内的每件事都将在第二个线程中执行。

内嵌函数

作为自变量接收的函数令人讨厌的是编译器需要为它们创建类,这将影响性能。但是,这可以用保留字inline容易地解决。

由于Inline函数是在编译时将它的代码替换对它的调用,所以在性能方面影响较少。为此,它不需要用额为的对象。

我们能够转换doAsync到一个inline函数:

1 inline fun doAsync(crossinline f: () -> Unit) {
2     Thread({ f() }).start()
3 }

在这个例子中,由于我们从另一个执行内容(另一个Lambda表达式)中调用f(),所以要求crossinline。不用太担心这些,在需要使用它时,编译器会提醒你的。

结论

如你所见,使用Lambda表达式后,我们能够简化很多我们的代码,甚至是在Java中不能实现的事。

另外,Kotlin的特别命名规则使我们能够创建属于我们自己的“开发语言”,并且还可以根据需要创建有意义的代码块。

Lambda表达式功能非常强大,这本书包含许多你能使用它们不同的情况

Kotlin和Java interop

时间: 2024-08-05 07:07:03

Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)的相关文章

用AndroidAnnotation简化Android开发

AndroidAnnotation是一个通过Annotation对代码进行预处理,简化Android开发,加快开发速度,提高代码可阅读性的一个框架.它的主要思路是:用编译时Annotation对代码进行标记,通过Java的Annotation Processing对代码进行预处理,补齐代码.如FindViewById这样重复被使用的代码,可以通过在类成员上加上@ViewById(R.id.xxx)来标记,而系统自动生成view=this.findViewById(R.id.xxx)这样的代码.使

Python-yield 三元运算 Lambda表达式

yield(保存函数的执行状态) 一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行.虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行.看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield

Java8 Lambda表达式介绍

欢迎进入我的博客:blog.scarlettbai.com查看更多文章 Lambda表达式是Java8里的一个重要特性,发布这么久了,最近在学swift语言时发现了其中的闭包的概念其实跟Lambda表达式极其相似,于是今天整理一下Java8中的Lambda表达式,做个介绍. Lambda表达式其实就是提供Java编程中对于函数式编程的支持,在我们习惯了一切皆对象时,刚接触Lambda可能读起来比较费劲,但是习惯之后,其确实有助于代码的简洁,且在Python.swift等中都有类似于Lambda这

<JAVA8新增内容>关于匿名内部集合和lambda表达式

要想说清楚JAVA中的Lambda表达式,必须想讲一下匿名内部类来帮助理解本质. 一.匿名内部类 匿名内部类适合创建那种只需要一次使用的类,例如前面介绍命令模式时所需要的Command对象,匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该类的实例,这个类的定义立即消失,匿名内部类不能重复使用. 语法格式一般如下: new 实现接口() | 父类构造器 (实参列表){ //匿名内部类的类体部分 } 从上面可以看出,匿名内部类必须继承一个父类,或者实现一个接口,但最多只能继承一个父类,或者

Java8新特性小结-接口与Lambda表达式

Java8的新特性相对于前版本(Java7)来说,主要体现在两个方面: 1.   接口定义与使用 2.   Lambda表达式对匿名内部类的简化使用. Java8新特性的具体表现如下: 1.在接口中的体现 (1)在接口中可以定义实体方法,但除原先的抽象方法外只能定义两种方法: A.公共的静态方法 如: package com.jasberyon.java8.interfacer; public interface InterfaceA { public static void sayHi(){

深入学习Java8 Lambda表达式 -- 从函数式接口说起

希望本文能够成为Java8 Lambda表达式的快速入门指南. 函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Java8 Lambda表达式的关键所在,所以放在最开始讨论.FI的定义其实很简单:任何接口,如果只包含唯一一个抽象方法,那么它就是一个FI.为了让编译器帮助我们确保一个接口满足FI的要求(也就是说有且仅有一个抽象方法),Java8提供了@FunctionalInterface注解.举个简单的例子,Runnable接口就是一个FI,下面是它的源

Java8 Lambda表达式应用案例 -- 单线程游戏服务器+异步数据库操作

前段时间我们游戏服务器的开发环境升级到了Java8,这两天我又把服务器的线程模型重新设计了一下,用上了Lambda表达式.Lambda表达式确实能够大幅简化Java代码,特别是丑陋不堪的匿名内部类,这篇文章主要就是想和大家分享这一点. 线程模型 首先简单介绍一下我们游戏服务器的线程模型,大致如下图所示: Netty线程池只处理消息的收发,当Netty收到消息之后,会交给游戏逻辑线程处理.由于是单线程在处理游戏逻辑,所以每一个消息必须很快处理完,也就是说,不能有数据库等耗时操作,不然逻辑线程很可能

Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法

今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的,这篇文章就来聊聊这些新特性. lambda 表达式 lambda 表达式在项目中也是用到了,这种新的语法的加入,对于使用 Java 多年的我,我觉得是如虎添翼的感觉哈,这种新的语法,大大的改善了以前的 Java 的代码,变得更加的简洁,我觉得这也是为什么 Java8 能够很快的流行起来的原因吧.

Java8特性Lambda表达式

Lambda 表达式 简介: Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). (parameters) -> expression 或 (parameters) ->{ statements; } 使用 Lambda 表达式需要注意以下两点: Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口.在上面例子中,我们使用各种类型的Lambda表达式来定义MathO