内容简介:关于Kotlin的文章,已经构思了很久。一直不知道该怎么写。文档式文章?那不如直接看文档,何必需要我再多“哔哔”呢。思来想后,决定写一篇快速在Android开发中感受Kotlin的其妙的文章。说实话,最开始搞Kotlin我是拒绝的。为啥?因为完全没有感觉到用它替换Java开发有什么实质性的改变;而且感觉语法很“别扭”!(其实说白了,就是不想学,给自己找借口。哈哈)但是,后来机缘巧合却感受到了Kotlin的有趣之处。当然这一切的开始,要克服写久了Java的那一种“别扭”(由其是Lambda写的也不多的情况下
关于Kotlin的文章,已经构思了很久。一直不知道该怎么写。文档式文章?那不如直接看文档,何必需要我再多“哔哔”呢。思来想后,决定写一篇快速在Android开发中感受Kotlin的其妙的文章。
说实话,最开始搞Kotlin我是拒绝的。为啥?因为完全没有感觉到用它替换 Java 开发有什么实质性的改变;而且感觉语法很“别扭”!(其实说白了,就是不想学,给自己找借口。哈哈)
但是,后来机缘巧合却感受到了Kotlin的有趣之处。当然这一切的开始,要克服写久了Java的那一种“别扭”(由其是Lambda写的也不多的情况下)。OK,不扯了。文章将从我接触Kotlin时,遇到“别扭”的地方开始展开。
正文
静态方法
第一个让我懵逼的是静态方法。在Kotlin里边被叫做了:伴生对象。这里不扯“花里胡哨”的介绍。直接上代码:
public class StringUtils{ public static void myFun(){ Log.d("StringUtils","Haha"); } } 复制代码
在Java中这么一个简单 工具 类中的静态方法,Kotlin要怎么写?
class StringUtils{ companion object { fun myFun(){ Log.d("StringUtils","Haha") } } } 复制代码
匿名内部类
setOnClickListener是我们比较常用的匿名内部类的使用场景:
btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("Listener","Haha") } } 复制代码
那么到了Kotlin中又是什么样子了呢?
btn.setOnClickListener { Log.d("Listener","Haha") } 复制代码
直接帮我们Lambda化了。如果我们不想Lambda化那应该是什么样子?
btn.setOnClickListener(object : View.OnClickListener{ override fun onClick(v: View?) { Log.d("Listener","Haha") } }) 复制代码
也没什么特别的,其实就是Kotlin的语法。因为Kotlin里边声明的变量要写在前面,其类型用:号隔开,写在后面。也就是现在这个样子。不过需要注意的,这里的 object 代表匿名对象类型。
这里有一个小细节,不知道大兄弟们有没有注意到。在Java中我们new匿名内部类的时候: new View.OnClickListener(){}
,是有()的。而在Kotlin中则: View.OnClickListener{}
没有()。这里也是属于语法细节,加上()表示显示的调用这个类的构造方法。
如果这样的话,那就和new普通的类,没什么区别的(而不是匿名内部类)。借着匿名内部类,我们直接来看一下Kotlin在RxJava中的实战。
Kotlin in RxJava
先看一个很简单的Java用法:
Observable.just(0) .map(new Function<Integer, String>() { @Override public String apply(Integer integer) throws Exception { return integer.toString(); } }) .subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { Log.d("RxJava", s); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { Log.d("RxJava", throwable.getMessage()); } }); 复制代码
对于Kotlin来说,在Lambda的加持之下,写法变得异常的简洁(当然Java进行Lambda化也很简洁):
Observable.just(0) .map({ it!!.toString() }) .subscribe({ t: String -> Log.d("RxJava", t) }, { t: Throwable -> Log.d("RxJava", t.message) }) 复制代码
如果对Lambda不是很熟悉的大兄弟们,肯定有点懵。那么咱们换成普通的kotlin,,是不是感觉很熟悉? object 又出现了,没错这里就是普通的匿名内部类而已。
Observable.just(0) .map(object : Function<Int, String> { override fun apply(t: Int): String { return t.toString() } }) .subscribe(object : Consumer<String> { override fun accept(t: String) { Log.d("RxJava", t) } }, object : Consumer<Throwable> { override fun accept(t: Throwable) { Log.d("RxJava", t.message) } }) 复制代码
Kotlin in Adapter
上述的几块代码,我们一起感受了Kotlin在RxJava中的变形。说实话,如果抛出Lambda,真心谈不上什么大的变化。就是语法上的转变。聊过了我们日常开发比重比较大的RxJava,接下来我们再来看一看另一个重头戏Adapter。这里直接上Kotlin代码:
class TestAdapter(var data: List<String>,var context:Context) : RecyclerView.Adapter<TestAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder { return ViewHolder(TextView(context)) } override fun getItemCount(): Int { return data.size } override fun onBindViewHolder(holder: ViewHolder?, position: Int) { holder!!.textView.text = "Haha" } class ViewHolder(var textView: TextView) : RecyclerView.ViewHolder(textView) } 复制代码
最开始看这个代码的时候,我是有点懵的,感觉不知所措。其实带入Kotlin的语法,非常的好理解。在最开始声明这个class的时候,我们直接在TestAdapter的 主构造方法 中声明了两个 var 的变量。这种写法就类似于Java中的:
class TestAdapter { public List<String> data; public Context context; public TestAdapter(List<String> data, Context context) { this.data = data; this.context = context; } } 复制代码
这也就是为什么我们能在class里边随意调用data和context的原因。
注意 var ,如果我们在构造方法中声明时不加上var,就可以理解为这个变量是局部变量。只适用于构造方法中。
这中间override的代码应该没什么好说的,我们来看一下最后声明的class ViewHolder。正常来说我们在Java中的ViewHolder都是这个样子:
public class ViewHolder extends RecyclerView.ViewHolder { public TextView textView; public ViewHolder(TextView textView) { super(textView); this.textView= textView; } } 复制代码
那为什么到了Kotlin之中,就变成了短短的一行 class ViewHolder(var textView: TextView) : RecyclerView.ViewHolder(textView)
了呢?其实也没有什么神奇的,就是正常语法而已。 这小结开始的时候,我们提到了 主构造方法 ,以及在 匿名内部类 这个小结中提到 加上()表示显示的调用这个类的构造方法。 因此Kotlin的这段代码非常的好理解:
就是把主构造方法中传递的textView,传给RecyclerView.ViewHolder()构造方法中。也就是和我们的Java代码一毛一样的,只是写法不同罢了。
尾声
OK,关于Kotlin在我们Android开发这些别扭的地方就暂时写到这。其实说白了,这些都是 最基本的语法 问题。这里挑出来的这几个Android的场景,是我在自以为学会语法的时候,觉得别扭的地方。当然别扭的原因还是因为自己对语法并不够理解。所以才有了这篇文章,希望可以给正准备走上Kotlin这条路上的大兄弟们一些帮助吧~
我是一个应届生,最近和朋友们维护了一个公众号,内容是我们在从应届生过渡到开发这一路所踩过的坑,以及我们一步步学习的记录,如果感兴趣的朋友可以关注一下,一同加油~
以上所述就是小编给大家介绍的《快速切换至Kotlin for Android模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- iOS Xcode 的汇编模式切换
- windows server 2012 切换成英文模式
- 技巧:根据主题模式 (dark/light) 切换 favicon
- php – 这是一个糟糕的模式吗? (切换/ foreach循环内部)
- zuihou-admin-cloud 1.3 发布, 多租户模式可自由切换
- Egret场景切换管理类切换和单例使用方法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议
胡谷雨、吴礼发、W.Richard Stevens / 胡谷雨 / 机械工业出版社 / 2000-9 / 35.00元
《CP.IP详解(卷3):CP事务协议.HP.P和UIX域协议》是“TCP/IP详解系列”的延续。主要内容包括:TCP事务协议,即T/TCP,这是对TCP的扩展,使客户-服务器事务更快、更高效和更可靠;TCP/IP应用,主要是HTTP和NNTP;UNIX域协议,这些协议提供了进程之间通信的一种手段。当客户与服务器进程在同一台主机上时,UNIX域协议通常要比TCP/IP快一倍。《CP.IP详解(卷3......一起来看看 《TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》 这本书的介绍吧!
Base64 编码/解码
Base64 编码/解码
URL 编码/解码
URL 编码/解码