具体功能实例下载: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的使用都是有点类似的。我是感觉非常的像。暂时先不说这个,本人也没搞懂具体区别在哪,有哪位大神知道可以留个言。