我与 Kotlin 的爱恨情仇之浅谈 block

前言

hi, IMSK。是的,你没看错,没迷路,这里是 Kotlin ,不是 Objective-C,别怕接下来跟我一起认识认识这个 block 的前世今生。前方高能,请您带上耳机,戴上眼镜。

block是什么?

先来看看 Kotlin 代码长什么样子:

其中 body 就是一个 block, () -> T 是一个 函数块( 函数签名 )。block 可以当做参数传入, 也可以当做返回值返回。在这里我就沿用我之前写 Objective-C 的习惯,暂且称作他为 闭包。

我爱 block

再来对比一下 Objective-C 里的 block:

double (^multiplyTwoValues)(double, double);

如果之前没有写过 OC,那么我想第一反应只能无奈的说一句:不觉明历。回头来看看,还是 Kotlin 更加亲切一些,直接 () -> T{}, 随便怎么玩,详细用法看官网吧 《Higher-Order Functions and Lambdas》 。

为什么爱上 block, 举个简单例子: 我们经常要处理一个异步请求,等数据返回的时候,回调给调用方,如果是用 Java 来写,可能要用到接口(callback)来实现了的。那么在 Kotlin 里怎么办呢?

声明:

调用:

看到了么?不用在像以前那样还要单独去写一个 callbackinterface 类了,是不是很简洁。

我不爱 block

当然很大一部分原因是因为当年被 OC 中的 block 折磨的心累,写法让人难受不说,OC 先天的冗长代码实在是累,如果是个新手,还经常内存泄露,折磨的死去活来的。这里提一下,block是一个闭包,开发过程中,切记由于闭包是可以访问上文数据,处理不当就会导致内存泄露哦。

当然还有另外一方面的原因,就是声明多参数的时候,比较难受,OC实在是不想在提了的,事实上 Kotlin 还算可以接受的,比如:

  • Kotlin 中 block 多参数声明
  • Kotlin 中 block 多参数调用

写在最后

Kotlin 中 block 随处可见 { ..do somethings.},所以咱必须得掌握它.

比如结合提供的列表操作的语法糖:

strings.filter{ it.length == 5 }.sortBy{ it }.map{ it.toUpperCase() }

比如在 Android 中写一个延迟的 Runnable

postDelayed({
    //do somethings block
},300)

block 让代码写起来更加方便,更加灵活(比如尾闭包等),函数式编程三板斧离不开它,但 block 同时带来的弊端也是有的,比如可读性差/内存管头疼等。但个人愚见,利大于弊,虽然一直褒贬不一,饱受争议的一个神奇的东西。既然提到 block 那么当然离不开另外一个神奇的东西 typedef 。还好最新的 Kotlin 中已经有了 一个类似的东西 Type aliases ((Type aliases (since 1.1) - Kotlin Programming Language) . 如果大家感兴趣的话,那我下一章来谈谈这个 block 离不开的小情人吧。

BTW 上面文中提到,block 会有内存泄露问题,无论还是 OC 是 Kotlin,当然我并没有提到如何解决,留给你第一个想象空间,那么第二个想象空间就是,既然有内存泄露,那么 block 的实现原理又是什么呢? 跟匿名内部类有什么区别呢?

原文发布于微信公众号 - Android群英传(android_heroes)

原文发表时间:2017-05-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏jeremy的技术点滴

javacv编码mp4视频

1.8K7
来自专栏企鹅号快讯

python中的时间处理大总结

北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 ? NVIDIA 深度学习学院 带你快速进入火热的DL领域 正文共485...

21910
来自专栏CSDN技术头条

不服来战,看Kotlin如何完爆Java

前言:Kotlin因支持谷歌和简化Android开发而声名鹊起。看看它如何解决Java的许多痛点。 Why Kotlin? 如果我今天被问到如何区别开发Andr...

2125
来自专栏向治洪

hello Kotlin

1.1 Kotlin的身世 写了许久 Java,有没有发现其实你写了太多冗余的代码? 后来你体验了一下 Python,有没有觉得不写分号的感觉真是超级爽? 你虽...

1955
来自专栏web前端教室

javascript ES6 初次相见

JS的ES6网上也热炒了好久了, 我一直也没怎么太细看, 今天想起来就写个东西, 也为分享,也为学习。 我喜欢接地气一点,所以网上的那些新名词我就不写了, 就写...

1817
来自专栏烙馅饼喽的技术分享

记一个脚本解释器的开发

最近可以有1个月左右的空闲,可以稍微整理一下这个脚本解释器的开发过程。 一、缘由   2014年左右,我们使用AIR技术,开发了一个3D战争类型的手游。那时候手...

3807
来自专栏腾讯Bugly的专栏

Android开发必备知识:为什么说Kotlin值得一试

1、Hello, Kotlin 1.1 Kotlin的身世 写了许久 Java,有没有发现其实你写了太多冗余的代码? 后来你体验了一下 Python,有没有觉得...

4359
来自专栏喔家ArchiSelf

一行Python代码

自从08年接触Python,就有爱不释手的感觉,逐渐地,有些不忍地疏远了Perl 和Shell编程,因为python 的优雅么? 不全是,主要是可以高效开发吧。

1584
来自专栏java工会

一分钟搞明白java8中的lambda|文末红包

2175
来自专栏转载gongluck的CSDN博客

黑暗的内存管理

黑暗的内存管理 很多人对 C 语言深恶痛绝,仅仅是因为 C 语言迫使他们在编程中必须手动分配与释放内存,然后通过指针去访问,稍有不慎可能就会导...

4046

扫码关注云+社区