Android培训
美国上市Android培训机构

400-111-8989

热门课程

快速上手Kotlin,11个方法教你快速上手Kotlin语言

  • 时间:2017-06-22
  • 发布:Android培训
  • 来源:Android教程

最近经常会收到一些“用Kotlin怎么写”的问题,作为有经验的程序员,我们已经掌握了一门或者多门语言,那么学Kotlin的时候就经常会有类似“‘再见’用日语怎么说?”、“‘你好’用西班牙语怎么说?”的问题,所以我决定把一些常用的语法对照列举出来,如果大家熟悉Java,那么快速上手Kotlin会变得非常地容易。
这篇文章主要是写给需要快速上手Kotlin的Java程序员看的,这时候他们关注的是如何Kotlin写出类似某些Java的写法,所以本文基本不涉及Kotlin的高级特性。

1.如何定义变量
Java定义变量的写法:

Stringstring="Hello";
基本等价的Kotlin定义变量的写法:

varstring:String="Hello"
Java定义final变量的写法:

finalStringstring="Hello";
注意到前面的是一个编译期常量,Kotlin当中应该这么写:

constvalstring:String="Hello"
同样是final变量,Java这么写:

finalStringstring=getString();
注意到,这个不是编译期常量,Kotlin这么写:

valstring:String=getString()
另外,Kotlin有类型推导的特性,因此上述变量定义基本上都可以省略掉类型String。

2.如何定义函数
Java当中如何定义函数,也就是方法,需要定义到一个类当中:

publicbooleantestString(Stringname){
...
}
等价的Kotlin写法:

funtestString(name:String):Boolean{
...
}
注意到返回值的位置放到了参数之后。

3.如何定义静态变量、方法
Java的静态方法或者变量只需要加一个static即可:

publicclassSingleton{
privatestaticSingletoninstance=...;

publicstaticSingletongetInstance(){
...
returninstance;
}}
用Kotlin直译过来就是:kotlinclassKotlinSingleton{companionobject{privatevalkotlinSingleton=KotlinSingleton()@JvmStaticfungetInstance()=kotlinSingleton}}注意getInstance的写法。JvmStatic这个注解会将getInstance这个方法编译成与Java的静态方法一样的签名,如果不加这个注解,Java当中无法像调用Java静态方法那样调用这个方法。

另外,对于静态方法、变量的场景,在Kotlin当中建议使用包级函数。

4.如何定义数组
Java的数组非常简单,当然也有些抽象,毕竟是编译期生成的类:

String[]names=newString[]{"Kyo","Ryu","Iory"};
String[]emptyStrings=newString[10];
Kotlin的数组其实更真实一些,看上去更让人容易理解:

valnames:Array<String>=arrayOf("Kyo","Ryu","Iory")
valemptyStrings:Array<String?>=arrayOfNulls(10)
注意到,ArrayT即数组元素的类型。另外,String?表示可以为null的String类型。

数组的使用基本一致。需要注意的是,为了避免装箱和拆箱的开销,Kotlin对基本类型包括Int、Short、Byte、Long、Float、Double、Char等基本类型提供了定制版数组类型,写法为XArray,例如Int的定制版数组为IntArray,如果我们要定义一个整型数组,写法如下:

valints=intArrayOf(1,3,5)
5.如何写变长参数
Java的变长参数写法如下:

voidhello(String...names){
...
}
Kotlin的变长参数写法如下:

funhello(varargnames:String){

}
6.如何写三元运算符
Java可以写三元运算符:

intcode=isSuccessfully?200:400;
很多人抱怨Kotlin为什么没有这个运算符。。。据说是因为Kotlin当中:使用的场景比Java复杂得多,因此如果加上这个三元运算符的话,会给语法解析器带来较多的麻烦,Scala也是类似的情况。那么这中情况下,我们用Kotlin该怎么写呢?

intcode=if(isSuccessfully)200else400
注意到,ifelse这样的语句也是表达式,这一点与Java不同。

7.如何写main函数
Java的写法只有一种:

classMain{
publicstaticvoidmain(String...args){
...
}
}
注意到参数可以是变长参数或者数组,这二者都可。

对应Kotlin,main函数的写法如下:

classKotlinMain{
companionobject{
@JvmStatic
funmain(args:Array<String>){

}
}
}
Kotlin可以有包级函数,因此我们并不需要声明一个类来包装main函数:

funmain(args:Array<String>){
...
}
8.如何实例化类
Java和C++这样的语言,在构造对象的时候经常需要用到new这个关键字,比如:

Datedate=newDate();
Kotlin构造对象时,不需要new这个关键字,所以上述写法等价于:

valdate=Date()
9.如何写Getter和Setter方法
Java的Getter和Setter是一种约定俗称,而不是语法特性,所以定义起来相对自由:

publicclassGetterAndSetter{
privateintx=0;

publicintgetX(){
returnx;
}

publicvoidsetX(intx){
this.x=x;
}
}
Kotlin是有属性的:

classKotlinGetterAndSetter{
varx:Int=0
set(value){field=value}
get()=field
}
注意看到,我们为x显式定义了getter和setter,field是x背后真正的变量,所以setter当中其实就是为field赋值,而getter则是返回field。如果你想要对x的访问做控制,那么你就可以通过自定义getter和setter来实现了:

classKotlinGetterAndSetter{
varx:Int=0
set(value){
valdate=Calendar.getInstance().apply{
set(2017,2,18)
}
if(System.currentTimeMillis()<date.timeInMillis){
println("Cannotbesetbefore2017.3.18")
}else{
field=value
}
}
get(){
println("Getfieldx:$field")
returnfield
}}
10.如何延迟初始化成员变量
Java定义的类成员变量如果不初始化,那么基本类型被初始化为其默认值,比如int初始化为0,boolean初始化为false,非基本类型的成员则会被初始化为null。

publicclassHello{
privateStringname;
}
类似的代码在Kotlin当中直译为:

classHello{
privatevarname:String?=null
}
使用了可空类型,副作用就是后面每次你想要用name的时候,都需要判断其是否为null。如果不使用可控类型,需要加lateinit关键字:

classHello{
privatelateinitvarname:String
}
lateinit是用来告诉编译器,name这个变量后续会妥善处置的。

对于final的成员变量,Java要求它们必须在构造方法或者构造块当中对他们进行初始化:

publicclassHello{
privatefinalStringname="Peter";
}
也就是说,如果我要想定义一个可以延迟到一定实际再使用并初始化的final变量,这在Java中是做不到的。

Kotlin有办法,使用lazy这个delegate即可:

classHello{
privatevalnamebylazy{
NameProvider.getName()
}
}
只有使用到name这个属性的时候,lazy后面的Lambda才会执行,name的值才会真正计算出来。

11.如何获得class的实例
Java当中:

publicclassHello{
...
}

...

Class<?>clazz=Hello.class;

Hellohello=newHello();
Class<?>clazz2=hello.getClass();
前面我们展示了两种获得class的途径,一种直接用类名,一种通过类实例。刚刚接触Kotlin的时候,获取JavaClass的方法却是容易让人困惑。

classHello

valclazz=Hello::class.java

valhello=Hello()
valclazz2=hello.javaClass
同样效果的Kotlin代码看上去确实很奇怪,实际上Hello::class拿到的是Kotlin的KClass,这个是Kotlin的类型,如果想要拿到Java的Class实例,那么就需要前面的办法了。
上一篇:搭建Kotlin开发环境教程
下一篇:Android常用的几种自动化测试框架

Android开发必备实用SDK推荐

Android开发源码剖析 便于性能分析的框架 hugo

Android 框架推荐小而美的日志框架 timber

Android 网络编程之WebView 的使用

选择城市和中心
贵州省

广西省

海南省