Kotlin 使用高阶函数实现回调方式_Android

来源:脚本之家  责任编辑:小易  

Kotlin 既具有面向对象又具有函数式结构。你既可以按 OO 风格也可以按 FP 风格使用,还可以

lambda 和 高阶函数

对于函数式编程,你可以学习一下haskell。重点的优点是语法灵活(在高阶函数里,你可以把函数当

之前学习了 lambda 和高阶函数,然后在 android 开发中对 onClick 事件进行监听是一个很常用的功能,kotlin 的常规实现如下:

Kotlin的基本词法, Kotlin的句法 ,Kotlin 的高阶函数的知识等,慕课网老师讲的很系

rootView.setOnClickListener { view -> println("点击了这个ID=${view.id}的view") }

What is KotlinKotlin,原意是在俄罗斯的一个小岛,JetBrain在2011年

然后在开发中不可避免的我们也要写一些自定义监听之类的代码。这个时候如果还用 java 的思想去实现的话就有点舍近求远了。

对于函数式编程,你可以学习一下haskell。重点的优点是语法灵活(在高阶函数里,你可以把函数当

java 思想实现

我们建议去高档一点的美发店去染!很多理发小店也可以提供染发服务,几十块钱就能染一次了。但是,这些小理发店使用的染发剂可能是最差的档次的,可能含有多种强碱作为软化头发的剂型。甚至为了染出更艳丽,更持久的颜色,使用了一些违禁的添加剂。这不仅会对头发造成严重损伤,而且这些有毒的对人体有害的染色剂还可能产生皮肤过敏等问题。而如果选择比较有名气的理发店做染发的话,一般产品会选择档次好一点的,或者至少产品是质量合格的。再加下造型师的专业技能,染发一般效果都还不错。而如果在家里染发的话,是比较省钱的,但这种方式要求选择比较好一些的染发剂。至少是国际大牌的染发剂产品,比如欧莱雅,施华蔻,露华浓等等品牌。不过,

在 java 中我们一般的做法是这样的

美洲世预赛积阿根廷后面赛程(最后一场客场对阵厄瓜多尔)这是南美世界杯预选赛目前为止最新的积分榜,现在阿根廷积22分排在第五位,最后四战分别是主场迎战委内瑞拉和秘鲁,客场面对乌拉圭和厄瓜多尔,不客观点讲,以阿根廷的实力,明显要比其他四队的实力都要高,连赢四场都有可能,排名只会越升越高,不可能会无缘世界杯的。如果客观点说,乌拉圭和厄瓜多尔是硬骨头,毕竟他们有一定的实力,而且又是阿根廷的直接竞争对手,不过厄瓜多尔赛程非常不易,因为他们除了要在最后一场主场迎战阿根廷外,前面三场还得做客面对巴西和智利的挑战,而且现在厄瓜多尔还落后阿根廷2分,所以厄瓜多尔想要超过阿根廷是很困难的。而乌拉圭的赛程则跟阿根廷

定义一个接口

有这几种坏习惯,鼻炎会永远伴随,治好了还会反复发作剪鼻毛、挖鼻孔、用力擤鼻涕等,这些不良的习惯会引起鼻炎这是为什么呢?今天我们来分析一下这些不好的习惯所带来的危害。今天给大家科普一些远离鼻炎的小知识,看了之后如果觉得对你有帮助,记得转发出去,告诉身边的朋友,或者你有更好的方法,也可以在我们的评论区给我们留言交流。在跟大家聊之前,先给大家看一张鼻子的结构图:鼻子结构图(图来网)一、感冒引起鼻炎在日常生活中,大多数小伙伴都是因为感冒而引起的鼻炎,那感冒是怎么引起鼻炎的呢?这里给大家科普科普。一般来讲,相对年轻一点的小伙子(16岁-35岁),对感冒其实都觉得不算什么,不会很重视它,因为觉得自己的身体

定义一个接口类型变量

不知不觉间,朋友圈早已从一个普普通通记录、分享生活的地方,变成了一个许多亲朋好友间“争奇斗艳”般炫耀自己的生活、相互攀比的“舞台”了。的确,许多人听到同龄人、或是同一个圈子里的朋友过得更好时,会感到一种“同伴压力”,新闻里的“没有英文名,不能和我的孩子做朋友”、“赢在子宫里”,还有我们每天都能感受到的“朋友圈焦虑”,其实都是同伴压力的体现。可能你也正感受着这种焦虑,所以为了不给原本已经艰难的生活再多加一层负累,选择了关闭朋友圈来减轻这种同伴压力——眼不见心不烦。因为,通过对比带来的同伴压力的确会改变我们的行为、想法,降低我们的幸福感。同伴压力会给我们造成怎样的影响?当人们听到“压力”这个词时,

定义一个 set 方法

调用 set 方法设置接口的实现类

用 kotlin 实现就是如下

class MyView{ //定义一个接口 interface IOnLabelCheckedListener { fun onLabelCheck(label: String) } //定义一个接口类型变量 private var onLabelChecked: IOnLabelCheckedListener? = null private fun initView(context: Context) { view.setOnCheckedChangeListener { radioGroup, i -> onLabelChecked.onLabelCheck(radioGroup.findViewById<RadioButton>(i).text.toString()) } } //定义一个 set 方法 fun setOnLabelCheckedListener(e: IOnLabelCheckedListener) { this.onLabelChecked = e } } // 调用set方法,通过匿名内部类实现 MyView.setOnLabelCheckedListener(object : LabelBarView.IOnLabelCheckedListener { override fun onLabelCheck(label: String) { } })

这样实现的问题

当然是太复杂了。而且最初的时候这样写一时搞不明白为什么 MyView.setOnLabelCheckedListener 方法内部不能传入 lambda 表达式,lambda 表达式的存在不就是为了替代匿名内部类嘛。而且如果这个接口定义的是一个 java 类型的接口就是可以用 lambda 表达式的。这是为什么?最后猜想是因为 kotlin 在和 java 互相调用的时候中间又包裹了一层,而我们直接使用 kotlin 来定义这个接口不存在中间这一层,而我们定义的 set 方法又不是一个高阶函数,当然不能使用 lambda 表达式。

下面就用 kotlin 的思想来实现回调

使用高阶函数来实现

kotlin 和 java 有一个重要的不同就是函数式编程。在函数式编程的思想中函数是一等公民,在使用 kotlin 时我们要多利用这种思维来思考问题。Kotlin 中提供了高阶函数,它可以直接使用一个函数来作为返回值,对于习惯于 java 来编程的我来说刚开始理解起来有些困难,下面我把我一步一步的实现一个高阶函数的思路写下,希望对大家有所帮助。

首先,能想到的就是函数传递,要用 lambda 来替代掉匿名内部类可以这样来实现

//从最基础的开始做,把匿名内部类通过 lambda 实现 MyView.setOnLabelCheckedListener(object : MyView.IOnLabelCheckedListener { override fun onLabelCheck(label: String) { println(label) } }) // 首先 MyView.IOnLabelCheckedListener 中只有一个方法 onLabelCheck(label: String) // 因此可以写出 lambda 表达式如下 var lam: (String) -> Unit = { label -> println(label) }

然后,需要把写好的 lambda 传递进去,这个时候就要求 setOnLabelCheckedListener 方法是一个高阶函数

// 这里接收一个 上面我们改造好的表达式 lam ,它内部实现应该是把 e 赋值给当前类的一个对象 fun setOnLabelCheckedListener(e: (String) -> Unit) { this.lisenter = e } //显然 lisenter 就应该是这样的 var linsnter: (String) -> Unit = {}

最后使用 linsnter 进行回调

private fun initView(context: Context) { view.setOnCheckedChangeListener { radioGroup, i -> linsnter(radioGroup.findViewById<RadioButton>(i).text.toString()) } }

最终代码结果:

class MyView{ var linsnter: (String) -> Unit = {} private fun initView(context: Context) { view.setOnCheckedChangeListener { radioGroup, i -> linsnter(radioGroup.findViewById<RadioButton>(i).text.toString()) } } fun setOnLabelCheckedListener(e: (String) -> Unit) { this.lisenter = e } } // 调用时将变量 lam 省略,直接使用一个表达式 view.setOnLabelCheckedListener { label -> println(label) }

最终的代码和之前的代码有两个最大的不同,一是没有了接口定义,二是没有了匿名内部类。

更好的使用高阶函数

高阶函数的使用更多的时候能使我们的代码更简洁,比如下面这段代码:

fun refreshData(e: ((Boolean, String) -> Unit)): Boolean { if (!UserInfoManager.getInstance().isLogin) { e(false, "未登录") return false } NETWorkUtils.request(ApiParamter(), object : ApiListener<ResponseData> { override fun onApiCompleted(data: ResponseData?) { e(true, "成功") } override fun onApiError(errorCode: Int, errorCodeMessage: String) { e(false, errorCodeMessage) } }) return true }

那么在调用它的时候就可以这样:

mView.refreshData { isSuccess, msg -> //do something }

是不是很简单,省去了再写一个接口。同时如果是用 java 来调用 refreshData 方法也一样可以的:

mView.refreshData(new Function2<Boolean, String, Unit>() { @Override public Unit invoke(Boolean aBoolean, String s) { // do something return null; } });

Kotlin 提供了一系列的 Function 接口类来供 java 调用高阶函数时使用,最多支持22个参数有兴趣的可以查看一下。

以上就是在 Kotlin 中使用高阶函数来替代传统的回调函数的方法。不对之处还请指正。希望能给大家一个参考,也希望大家多多支持真格学网。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

Kotlin是否有可能成为Android系统的下一代开发语言

Kotlin Kotlin的「简历」

来自于著名的 IDE IntelliJ IDEA(Android Studio 基于此开发) 软件开发公司 JetBrains(位于东欧捷克)

起源来自 JetBrains 的圣彼得堡团队,名称取自圣彼得堡附近的一个小岛 (Kotlin Island)

一种基于 JVM 的静态类型编程语言

来自知名的工具开发商 JetBrains,也就决定了 Kotlin 的基因中必然包含实用与高效等特征。那我们接下来看一看 Kotlin 的特点,当然这也是我改用 Kotlin 的重要原因。

语法简单,不啰嗦

Kotlin 支持类型推断,没有 Java 那样的啰嗦。

另外用 var 表示变量,val 表示常量更加的简洁

方法也很简单,连 function 都缩写成了 fun,平添了几分双关之意。

类的继承和实现很简单,使用:即可

Kotlin 每个句子都不需要加分号 (;)

空指针安全

空指针(NullPointerException 或 NPE)是我们使用 Java 开发程序中最常见的崩溃了。因为在 Java 中我们不得不写很多防御性的代码,比如这样:

在 Kotlin 中空指针异常得到了很好的解决。

在类型上的处理,即在类型后面加上?,即表示这个变量或参数以及返回值可以为 null,否则不允许为变量参数赋值为 null 或者返回 null

对于一个可能是 null 的变量或者参数,在调用对象方法或者属性之前,需要加上?,否则编译无法通过。

如下面的代码就是 Kotlin 实现空指针安全的一个例子,而且相对 Java 实现而言,简直是一行代码搞定的。

支持方法扩展

很多时候,Framework 提供给我们的 API 往往都时比较原子的,调用时需要我们进行组合处理,因为就会产生了一些 Util 类,一个简单的例子,我们想要更快捷的展示 Toast 信息,在 Java 中我们可以这样做。

但是 Kotlin 的实现却让人惊奇,我们只需要重写扩展方法就可以了,比如这个 longToast 方法扩展到所有的 Context 对象中,如果不去追根注意:Kotlin 的方法扩展并不是真正修改了对应的类文件,而是在编译器和 IDE 方面做得处理。使我们看起来像是扩展了方法。

Lambda, 高阶函数,Streams API, 函数式编程支持

所谓的 Lambda 表达式是匿名函数,这使得我们的代码会更加的简单。比如下面的代码就是 lambda 的应用。

所谓的高阶函数就是:

可以接受函数作为参数

也可以返回函数作为结果

举一个接受函数作为参数的例子。在 Android 开发中,我们经常使用 SharedPreference 来存储数据,如果忘记调用 apply 或者 commit 则数据修改不能应用。利用 Kotlin 中的高阶函数的功能,我们能更好的解决这个问题:

当然这上面的例子中我们也同时使用了方法扩展这个特性。

Kotlin 支持了 Streams API 和方法引用,这样函数式编程更加方便。比如下面的代码就是我们结合 Jsoup,来抓取某个 proxy 网站的数据,代码更加简单,实现起来也快速。

字符串模板

无论是 Java 还是 Android 开发,我们都会用到字符串拼接,比如进行日志输出等等。在 Kotlin 中,字符串模板是支持的,我们可以很轻松的完成一个字符串数组的组成:

注意:关于字符串拼接可以参考这篇文章Java细节:字符串的拼接。

与 Java 交互性好

Kotlin 和 Java 都属于基于 JVM 的编程语言。Kotlin 和 Java 的交互性很好,可以说是无缝连接。这表现在:

Kotlin 可以自由的引用 Java 的代码,反之亦然。

Kotlin 可以现有的全部的 Java 框架和库

Java 文件可以很轻松的借助 IntelliJ 的插件转成 kotlin

Kotlin 应用广泛

Kotlin 对 Android 应用开发支持广泛,诸多工具,比如 kotterknife(ButterKnife Kotlin 版),RxKotlin,Anko 等等,当然还有已经存在的很多 Java 的库都是可以使用的。

除此之外,Kotlin 也可以编译成 Javascript。最近使用 Kotlin 写了一段抓取 proxy 的代码,实现起来非常快捷。甚至比纯 JavaScript 实现起来要快很多。

关于性能

Kotlin 的执行效率和 Java 代码的执行效率理论上一致的。有时候 Kotlin 可能会显得高一些,比如 Kotlin 提供了方法的 inline 设置,可以设置某些高频方法进行 inline 操作,减少了运行时的进栈出栈和保存状态的开销。

读到这里,是不是想要尝试一下 Kotlin 呢,它简洁的语法,汇集诸多特性,高效率实现等等,已经在国外风生水起,国外的 Pintereset, Square, Flipboard 等公司已经开始应用到生产中。

关于转向 Kotlin

其实,我在做决定之前(当时 Kotlin 还没有被钦定)也曾有过考虑,是不是选择了 Kotlin 就意味着放弃 Java 呢,冷静下来想一想,其实并不是那么回事,因为 Kotlin 与 Java 语法太相近,以及在 Kotlin 中无时无刻不在和 Java 相关的东西打交道,所以这点顾虑不是问题的。

对于个人的项目来转向 Kotlin,通常不是很难的选择,毕竟 Kotlin 是那么优秀的语言,相信很多人还是愿意尝试并使用这个事半功倍的语言的。

为什么 Kotlin 调用 java 时可以使用 Lambda

1. Kotlin 中的 Lambda 表达式

如果你已经开始使用 Koltin, 或者对它有过一些了解的话,那么一定对这种写法并不陌生了:

// 代码一:Kotlin 代码view.setOnClickListener{

println("click")

}1234

它跟下面这段 Java 代码是等价的:

// 代码二:java 代码view.setOnClickListener(new View.OnClickListener() {    @Override

public void onClick(View v) {

System.out.println("click");

}

});1234567

和 Java8 一样,Kotlin 是支持 Lambda 表达式的,如代码一所示,就是 Lambda 的一个具体应用。

可见,使用 lambda 减少了很多冗余,使代码写起来更简洁优雅,读起来也更顺畅自然了。

但是,你有没有想过,为什么 Kotlin 可以这样写,这里为什么可以使用 lambda ?

2. 为什么可以这么写?

在 Kotlin 中,一个 Lambda 就是一个匿名函数。

代码一其实是对下面代码三的简写:

// 代码三:Kotlin 代码view.setOnClickListener({

v -> println("click")

})1234

之所以简写成代码一的样子,是基于这两点特性:

  • 如果 lambda 是一个函数的唯一参数,那么调用这个函数时可以省略圆括号

  • 如果 lambda 所表示的匿名函数只有一个参数,那么可以省略它的声明以及->符号(默认会用it来给省略的参数名命名)

  • OK,从代码三的结构中,能够更清晰的看出,这里的 view.setOnClickListener 函数是接收了一个 lambda 作为参数。而在 Kotlin 中,什么样的函数才能把lambda(也即另一个函数)作为参数呢?

    —— 对,就是高阶函数。

    什么是高阶函数?

    高阶函数是将函数用作参数或返回值的函数。

    这是 Kotlin 和 Java 的区别之一,java 中并没有高阶函数的支持(java8是有高阶函数的)。当我们在 java 中需要用到类似的概念时,通常的做法是传递一个匿名类作为参数,然后实现其中的某些抽象方法 —— 就比如上面的代码二。

    事实上,如果在 Android Studio 中,从 Kotlin 的代码查看 view.setOnClickListener 函数的定义,就会发现,看到的函数签名就是一个高阶函数的定义:

    函数签名提示

    如上图,所看到函数签名是:

    public final fun setOnClickListener(l: ((v:View!)->Unit)!): Unit

    当然,因为方法是在 Java 中定义的,所以它也列出了 Java 的声明,是这样:

    public void setOnClickListener(OnClickListener l)

    我们知道,Kotlin 跟 Java 的很多类型都有差异,所以它们在互相调用的时,会有一个按照对应关系的转换。

    对于上面的对 setOnClickListener 方法的转换,别的地方都好理解,比较难懂的是,为什么会把参数从 OnClickListener 类型转换成了 (View) -> Unit。

    (View) -> Unit 是一个函数类型,它表示这样一个函数:接收1个View类型的参数,返回Unit。

    正是这个对参数类型的转换,使得 setOnClickListener 方法在 Kotlin 中变成了一个高阶函数,这样正是它之所以能够使用 lambda 作为参数的原因。

    而这种转换,就是我们题目中所说到这篇文章的主角 —— SAM 转换 (Single Abstract Method Conversions)。

    3. 什么是 SAM 转换?

    好吧,说了这么多,终于到正题了。

    SAM 转换,即 Single Abstract Method Conversions,就是对于只有单个非默认抽象方法接口的转换 —— 对于符合这个条件的接口(称之为 SAM Type ),在 Kotlin 中可以直接用 Lambda 来表示 —— 当然前提是 Lambda 的所表示函数类型能够跟接口的中方法相匹配。

    而 OnClickListener 在 java 中的定义是这样的:

  • // 代码四:OnClickListener 接口在 java 中的定义public interface OnClickListener {    void onClick(View v);
  • }1234
  • —— 恰好它就是一个符合条件的 SAM Type,onClick 函数的类型即是 (View) -> Unit。所以,在 Kotlin 中,能够用 lambda 表达式 { println("click")} 来代替 OnClickListener 作为 setOnClickListener 函数的参数。

    4. SAM 转换的歧义消除

    SAM 转换的存在,使得我们在 Kotlin 中调用 java 的时候能够更得心应手了,它在大部分的时间都能工作的很好。

    当然,也偶尔会有例外,比如,考虑下面的这段代码:

  • // 代码五public class TestSAM {
  •    SamType1 sam1,;
  •    SamType2 sam2,;    public void setSam(SamType1 sam1) {        this.sam1 = sam1;
  •    }    public void setSam(SamType2 sam2) {        this.sam2 = sam2;
  •    }    public interface SamType1 {        void doSomething(int value);
  •    }    public interface SamType2 {        void doSomething2(int value);
  •    }
  • }123456789101112131415161718
  • —— TestSAM 有两个重载的 setSam 方法,

    —— 并且它们的参数( SamType1、SamType2 )都是 SAM Type 的接口。

    —— 并且 SamType1 跟 SamType2 的唯一抽象方法的函数类型都是 (Int) -> Unit 。

    o(╯□╰)o

    这种情况比较吊轨,但是还有有可能会出现的。这时候,如果在 Kotlin 中直接使用代码一类似的方式,就会报错了:

  • // 代码六:kotlin中调用,这段代码是编译不过的TestSAM().setSam {
  •    println("dodo")  
  • }1234
  • 会提示这里歧义,编译器不知道这个 Lambda 代表是 SamType1 跟 SamType2 中的哪一个接口。

    解决的办法就是手动标明 Lambda 需要代替的接口类型,有两种方式可以来标明:

  • // 代码七: 歧义消除// 方式一TestSAM().setSam (SamType1 { println("dodo")  })
  • // 方式二TestSAM().setSam ({ println("dodo") } as SamType1)12345
  • 当然,也还有一种方法是不再使用 SAM 转换的机制,而是直接使用一个 SamType1 的实例作为参数:

  • // 代码八: 使用一个实现接口的匿名类作为参数TestSAM().setSam(object : TestSAM.SamType1 {    override fun doSomething(value: Int) {
  •        println("dodo")
  •    }
  • })123456
  • 这种方法当然也是可以的,只是跟 lambda 相比起来,就显得不那么优雅了(优雅很重要!!!)。

    5. SAM 转换的*

    SAM 转换的*主要有两点 :

    5.1 只支持 java

    即只适用与 Kotlin 中对 java 的调用,而不支持对 Kotlin 的调用

    官方的解释是 Kotlin 本身已经有了函数类型和高阶函数等支持,所以不需要了再去转换了。

    如果你想使用类似的需要用 lambda 做参数的操作,应该自己去定义需要指定函数类型的高阶函数。

    5.2 只支持接口,不支持抽象类。

    这个官方没有多做解释。

    我想大概是为了避免混乱吧,毕竟如果支持抽象类的话,需要做强转的地方就太多了。而且抽象类本身是允许有很多逻辑代码在内部的,直接简写成一个 Lambda 的话,如果出了问题去定位错误的难度也加大了很多。

    6. 总结

    OK,讲完了。

    总结起来就是 SAM 转换就是 kotlin 在调用 java 代码时能使用 Lambda 的原因。了解了其原理,能够让我们在写代码更自如,在偶尔出问题的时候也能更好更快地解决。

android kotlin anko怎么用

Kotlin是由JetBrains开发并且开源的静态类型JVM语言。比Java语言语法简洁,支持很多Java中不支持的语法特性,如高阶函数、内联函数、null安全、灵活扩展、操作符重载等等。而且它还完全兼容Java,与Scala类似,但是Scala的宗旨是“尽可能自己实现,不得已才使用Java”,而Kotlin却相反:“尽可能复用Java的实现,不得已才自己实现”。所以相比之下Kotlin更简洁轻量,非常适合移动端的开发。另外JetBrains针对Android开发提供了一个由Kotlin实现的“anko”开源库,可以让你使用DSL的方式直接用代码编写UI,让你从繁琐的xml中解脱出来,而且避免了xml解析过程所带来的性能问题。

这篇先讲怎么去使用idea(Android Studio用户也一样)搭建Kotlin的Android开发环境。

一、下载以下相关idea插件:

1. Kotlin

2. Kotlin Extensions For Android

3. Anko DSL Preview

其中Anko DSL Preview插件用于预览使用DSL编写的UI代码,就像以前使用xml编写UI文件时可以动态在“Preview”窗口预览效果一样。

二、新建Android项目

在src/main目录下,新建kotlin目录(用于放置kotlin代码),配置Gradle如下:

1 buildscript {

2 ext.kotlin_version = '0.12.1230'

3 repositories {

4 mavenCentral()

5 }

6 dependencies {

7 classpath 'com.android.tools.build:gradle:1.1.1'

8 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

9 classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"

10 }

11 }

12 apply plugin: 'com.android.application'

13 apply plugin: 'kotlin-android'

14

15 repositories {

16 mavenCentral()

17 }

18

19 android {

20 compileSdkVersion 22

21 buildToolsVersion "22.0.1"

22

23 defaultConfig {

24 applicationId "com.wangjie.androidwithkotlin"

25 minSdkVersion 9

26 targetSdkVersion 22

27 versionCode 1

28 versionName "1.0"

29 }

30

31 sourceSets {

32 main.java.srcDirs += 'src/main/kotlin'

33 }

34

35 buildTypes {

36 release {

37 minifyEnabled false

38 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

39 }

40 }

41 }

42

43 dependencies {

44 compile fileTree(dir: 'libs', include: ['*.jar'])

45 compile 'com.android.support:appcompat-v7:22.2.0'

46 compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

47 compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

48 compile 'org.jetbrains.anko:anko:0.6.3-15'

49 }

openjdk会用kotlin来开发吗

What is Kotlin

Kotlin,原意是在俄罗斯的一个小岛,JetBrain在2011年推出了以这个来命名的一个运行在JVM上的语言, 看上去有点类似C#和Scala的结合,并且同为静态类型,作为一门JVM上的语言,可以轻松兼容Java,并且整个语言设计的非常轻量。目前的版本为0.12.200,尚未发布正式版。

Kotlin的和配置在其上有,在这里就不再赘述了,值得一提的是,作为JetBrains家出品的语言,自家的IDEA当然全力支持!

基本语法介绍

Kotlin的语法非常简洁,熟悉Java或者Scala的人都可以快速上手:

函数声明:

fun foo(va: Int): Int {

return 1

}

也可以单行声明:

fun foo(va: Int): Int = 1

lambda当然也是支持的:

var c = {foo: Int -> println(foo)}

Kotlin中的函数是一等对象,自然支持高阶函数:

var c = {foo: Int -> println(foo)}

fun fooTest(func: (Int)->()) = println("I'm Groot")

fooTest(c)

类与接口

类可以这样进行声明:

class Bar(var b: Int): Foo() {

var c = 1

init {

println("class initializer")

}

constructor(): this(1) {

println("secondary constructor")

}

}

Bar类在这里继承了Foo类,Bar类有两个构造函数,直接在Bar类头的是primary constructor,另外一个构造函数使用constructor关键字定义,注意必须要先调用primary constructor,另外,init标明的是class initializer,每个构造函数都会首先调用class initializer里面的代码,再调用构造函数

Inner class:

class Outer {

class Inner {

}

}

Kotlin同样支持嵌套的内部类,不过和Java不一样的是,Kotlin的内部类不会默认包含一个指向外部类对象的引用,也就是说,Kotlin中所有的内部类默认就是静态的,这样可以减少很多内存泄露的问题。另外,如果需要在内部类中引用外部类对象,可以在Inner类的声明前加上inner关键字,然后在Inner类中使用标记的this:this@Outer来指向外部类对象

Singleton:

object Single {

var c = 1

fun foo() = println("foo")

}

Kotlin中使用object关键字声明一个singleton对象,后面这里的方法就可以直接使用Single.foo()来调用了

  • 本文相关:
  • 使用kotlin实现mvp的方式(简单好用)
  • 关于kotlin写界面时诸多控件的点击事件
  • kotlin context使用详解
  • android的textview与html相结合的具体方法
  • android利用recyclerview编写聊天界面
  • android webview如何加载html,css等语言的示例
  • 浅谈glide缓存key的问题
  • android 中listview点击item无响应问题的解决办法
  • android实现图片滚动和页签控件功能的实现代码
  • android学习小结之获取被启动的activity传回的数据
  • 在android textview中显示图片的4种方式详解
  • 一篇文章揭开kotlin协程的神秘面纱
  • android仿微信实现评论功能
  • Kotlin是否有可能成为Android系统的下一代开发语言
  • 为什么 Kotlin 调用 java 时可以使用 Lambda
  • android kotlin anko怎么用
  • openjdk会用kotlin来开发吗
  • kotlin实战这本书与官网有区别吗
  • Kotlin是面向对象还是函数式语言
  • kotlin 函数式编程有什么用
  • 入门kotlin需要具备哪些知识
  • xutils可以使用kotlin开发吗
  • Kotlin 是怎样一等支持函数式编程的
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言其它相关首页android使用kotlin实现mvp的方式(简单好用)关于kotlin写界面时诸多控件的点击事件kotlin context使用详解android的textview与html相结合的具体方法android利用recyclerview编写聊天界面android webview如何加载html,css等语言的示例浅谈glide缓存key的问题android 中listview点击item无响应问题的解决办法android实现图片滚动和页签控件功能的实现代码android学习小结之获取被启动的activity传回的数据在android textview中显示图片的4种方式详解一篇文章揭开kotlin协程的神秘面纱android仿微信实现评论功能一看就懂的android app开发入门教微信公众平台开发入门教程(图文详android基础之使用fragment控制切六款值得推荐的android(安卓)开android textview设置中文字体加android应用开发sharedpreferencandroid 动画之translateanimatiandroid压力测试命令monkey详解android按钮单击事件的四种常用写android调试工具ddms的使用详解flutter适配深色模式的方法(darkmode)基于android开发支持表情的实现详解谷歌被屏蔽后如何搭建安卓环境android toolbar的简单使用android listview万能适配器实例代码android仿微信实现下拉列表android开发技巧之viewstub控件惰性装载android编程实现自定义imageview圆图功能详解android viewcompat的作用android之解析json数据示例(android原生
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved