kotlin习惯用法——kotlin官方文档学习

来源:互联网 发布:守望传输数据遇到问题 编辑:程序博客网 时间:2024/06/04 19:21

具体功能实例下载:kotlin项目下载地址

kotlin官方文档传送门:传送门

在学习kotlin官方文档的同时,我将会用纯kotlin语言编写kotlin文档类似的界面在app中展示出来,今天我们要说的是习惯用法。我们编写的界面目录在这个位置:


请打开我们kotlin习惯用法官方文档页面:

看完这个习惯用法之后,和前面基本语法不同,我感觉我已经喜欢上了kotlin的写法,不仅写法比java更加简单,而且写法更加的清晰,扩展性更强。

我们先说一下这个数据类,我太喜欢它了:

我们都知道MVC、MVP的开发模式,当我们要写一个Module的时候,就免不了要新建一个java文件来特地的来存储这些数据类,而且要反复的写get、set方法,十分的恼火,在kotlin里面就不需要了,一个data class直接解决所有的问题

这里有一个延迟属性,可能有些人看不懂是什么意思,其实实际用到的应该不多。举一个简单的例子,在数据库的应用中这个属性应该用的挺多的:

比如说我要从数据库中取1000条数据,但是我嫌一次性把这1000条数据全部都加载太麻烦,而且太占内存,怎么办呢?我们可以使用懒加载的方式,先初始化1000条空的数据,当这里面的某条数据被使用的时候,我再加载这个数据,加载这个数据资源。

这个就是懒(Lazy)加载的实现方式。估计实际开发中应用并不多,有兴趣的可以深入研究一下。


下面这个也是我非常喜欢的扩展函数,这个是java里面所没有的:

在java中我们要给一个类添加一个函数,我们就必须要在这个类中定义函数(这个函数可能只是在特定的某些其他类中使用),这样,一个类当中的函数就越来越多,而且越来越难维护了。这个是一个java程序遇到后期越难维护的一个原因之一。

扩展函数很好的解决了这样一个问题,我很喜欢这种写法,虽然可能某种程度上会让代码看上去有点“乱”。在B类中定义一个A类的扩展函数,该扩展函数只能在B类中调用。例如上面的扩展函数,如果你在B类中定义了该扩展函数。String.spaceTocamelCase()函数只能在B类当中使用,在其他类当中String类是没有spaceTocamelCase方法的。


创建单例的这种方式我也很喜欢,要知道我们在java中创建单例要这样写:

Activity instance = null;

if(instance == null){

instance = new Activity();

}else

return instance;

每定义一个单例都要这样写,不用我说,kotlin看上去就简单很多,我很喜欢这种写法。

这一段代码还是比较难理解的,至少我第一次看的时候我是没有看懂的,我们分开理解:

files?.size是指当files不为空时,去取file.size的值。即:

if(file == null)

”不执行任何代码“

else

file.size

下面我们说一下后面 ?:是什么意思:

var value = files?.size

if( value == null)

value = "empty"

else

return value

就这样把,解释的应该比较清楚了,这段代码还是非常有意思的,跟  

Boolean result  = a > b ? true : false;

这种代码有点类似,并吸取了其中的长处,添加了空值的判断

这个也是java里面没有的,但是很有趣,在java里面我们要写成这样:

String result = null;

if(param == 1)

result = "one";

else if(param == 2)

result = "two";

还是很不错的,少写了不少重复代码,我喜欢这种改进的方式。

这个apply方法我是要给一个大大的赞字的,没有什么好说的,简直太好用了,在java里面定义builder是这样的:

class MyBuilder{

    public MyBuilder fun1(){

    System.out.println("我调用了fun1");

   return this;

}

  public MyBuil;der fun2(){

  System.out.println("我调用了fun2");

  return this;

}


}

然后调用 new MyBuilder().fun1().fun2()这样来连续调用这两个函数,不仅要求函数返回对象是当前类的实例,而且写法单一重复。看看在kotlin里面的写法:

class MyBuilder{

fun testApply1(test:String ="testApply1"):String{    println(test)    return test}fun testApply2(test:String = "testApply2"):String{    println(test)    return test}

}

然后调用 MyBuilder(),apply{

   testApply1()

   testApply2()

}

就行了,kotlin可以让函数返回不同类型的值,如下:

MyBuilder().apply{

var test = testApply1()

testApply2(test)

}

第一种打印结果是: testApply1 、testApply2

第二种打印结果是:testApply1、testApply1

apply这种写法比java里面builder的写法更为灵活而且更为简单,

到这是不是发现let、apply和with的使用都是有点类似的。我是感觉非常的像。暂时先不说这个,本人也没搞懂具体区别在哪,有哪位大神知道可以留个言。

原创粉丝点击