本篇文章主要对比Java跟Kotlin的基本语法在写法上的区别。无论学习何种语言,学习它的基本语法都是第一步。
目录
一、分号;
二、定义变量、常量 三、字符串模板与字符串面值 四、自动类型转换 五、定义函数 六、注释 七、控制流 八、集合一、分号;
在Java中,使用分号;
标志一句完整代码的结束。 在Kotlin中,一句代码结束后不用添加分好。
二、定义变量、常量
Java定义变量时把数据类型放在前面,变量名放在后面。
int a = 1;int b;b = 2;复制代码
Kotlin用var
定义变量,把数据类型放在后面,并用冒号:
隔开。
var a: Int = 1var b: Intb = 2复制代码
Java用final
定义常量,把final
放在数据类型前面。
final int a = 1;final int b;b = 2;复制代码
Kotlin用val
定义常量,把数据类型放在后面,并用冒号:
隔开。
val a: Int = 1val b: Intb = 2复制代码
三、字符串模板与字符串面值
1.字符串模板 在Kotlin中,字符串可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美元符($)开头,由一个简单的名字构成,如:
var a: String = "a"var b: String = "b"var c: String = "$a$b"复制代码
上面几行代码在Java中就等于
String a = "a";String b = "b"String c = a + b复制代码
2.字符串字面值 Kotlin有两种字符串面值,转义字符串和原生字符串。
- 转义字符串 转义字符串跟java字符串一样,转义采用反斜杠方式,如:
var a: String = "a"var b: String = "b"Toast.makeText(this, "$a\n$b", Toast.LENGTH_SHORT).show()复制代码
运行代码:
- 原生字符串 原生字符串可以用三个"""作为分隔符括起来,内部没有转义并且可以包含换行和任何其他字符:
var a: String = "a"var b: String = "b"var c: String = """ $a $b """Toast.makeText(this, c, Toast.LENGTH_SHORT).show()复制代码
运行代码:
可以看到前面有一段空格,这个时候可以通过trimMargin() 函数去除前导空格:
var a: String = "a"var b: String = "b"var c: String = """ |$a $b """.trimMargin()Toast.makeText(this, c, Toast.LENGTH_SHORT).show()复制代码
运行代码:
如上面例子所示,在需要去掉前导空格的那一行前面加上竖杠"|",再调用trimMargin()方法,就可以去掉前导空格。
四、自动类型转换
Kotlin在定义变量或者常量时给他赋值,可以不指定他的类型,如:
var a = "aaa" //这里的a是String类型val b = 1 //这里的b是Int类型复制代码
五、定义函数
- 无返回值无参数
Java定义无返回值无参数方法,返回类型是void
void abc() {}复制代码
Kotlin定义无返回值无参数函数,返回Unit
fun abc(): Unit{}复制代码
也可以什么都不返回
fun abc(){}复制代码
可以看到Kotlin返回值的类型在函数末尾指定,并用冒号:
分隔。
- 无返回值有参数
Java定义无返回值有参数方法,返回类型是void
void abc(String str) {}复制代码
Kotlin定义无返回值有参数函数,返回Unit(或不返回)
fun abc(str: String) {}复制代码
括号里的参数跟定义变量常量一样,先指定参数名,再指定参数类型,并用冒号:
分隔。
- 有返回值有参数
Java定义有返回值有参数方法,返回类型是String
String abc(String str) { return "";}复制代码
Kotlin定义有返回值有参数函数,返回类型是String
fun abc(str: String): String { return ""}复制代码
返回值的类型在函数末尾指定,并用冒号":"分隔。
六、注释
-
单行注释 Java跟Kotlin一样
//单行注释
-
多行的块注释
Java跟Kotlin都可以这样
/* 这是一个多行的 块注释。 */复制代码
Kotlin块注释支持嵌套,代码如下:
/* 这是一个多行的块注释。 /*再嵌套一个 块注释 */*/复制代码
而Java不支持块注释嵌套
七、控制流
1.if表达式与三元运算符
Kotlin和Java中的条件语句用法大致相同,其中不同的是Kotlin中的if语句本身就是表达式,有返回值,类似于Java的三元表达式,如下所示: Java三元表达式
c = a > b ? 3 : 4;//如果a>b,c=3,否则c=4复制代码
对应的Kotlin中的if表达式
var c = if (a > b) 3 else 4复制代码
如果 if 或 else 后面是代码块的话
var c = if (a > b) { 3} else { 4}复制代码
2.when与switch
Kotlin中没有Java的switch语句,取而代之的是更强大的when语句,如下所示: Java中的switch语句
int a = 0;switch (a) { case 0: break; case 1: break; default: break;}复制代码
Kotlin中对应的when语句
var a = 0when (a) { 0 -> {} 1 -> {} else -> {}}复制代码
注意:when语句在满足条件的分支执行后,会终止when语句执行,所以不用像switch语句那样每一个case都加上break。 如果很多分支需要用相同的方式处理,when语句可以把多个分支条件放在一起,用逗号,
分隔,如下所示:
var a = 0when (a) { 0 -> {} 1,2 -> {//如果a=1或a=2,执行该代码块} else -> {}}复制代码
when语句还能像if语句那样作为表达式:
var a = 1var b = when (a) { 0 -> 0 //如果a=0,则b=0 1 -> 1 //如果a=1,则b=1 else -> 2 //如果a=其他,则b=2}复制代码
3.关键字in
当我们要判断5是否在1-10里面,在Java中可以这么写
int a = 5;for (int i = 0; i < 10; i++) { if (i == a) { return true; } else { return false; }}复制代码
如果同样的判断用Kotlin来写,可以用关键字in
来判断
if (5 in 1..10){//1..10代表1-10的意思 return true}else{ return false}复制代码
4.关键字is
在Kotlin中可以用关键字is
判断对象的类型,如下所示:
fun hasPrefix(x: Any) = when(x) {//kotlin中所有类都有一个共同的父类: Any is String -> {//如果x是String类型,执行该代码块} is Int -> {//如果x是Int类型,执行该代码块} else -> false}复制代码
注意上面出现了Any
,Any
是Kotlin中所有类都有一个共同的父类,有点像Java中的Object
,但这个类不是java.lang.Object,这个类只有equals()、 hashCode()、toString()方法。
5.for循环
如果你想要通过索引遍历一个数组或者一个list,可以使用for循环,如下所示: Java代码
for (int i = 0; i < array.size(); i++) { System.out.println(i);}复制代码
Kotlin代码
for (i in array.indices) { println(array[i])}复制代码
除了普通的用法之外,Kotlin的for循环还可以这样:
for ((index, value) in array.withIndex()) { println("the element at $index is $value") //index是索引,value是值}复制代码
6.while 循环
Java跟Kotlin的while循环是一样的,分为while和do...while:
var i = 0while(i++ < 10){}do{ }while(i++<10){}复制代码
八、集合
Java中的List,Set,Map:
Listintegers = new ArrayList<>();integers.add(1);integers.add(2);integers.add(3);integers.remove(1);integers.get(2);integers.clear();Map map = new HashMap<>();map.put("1", 1);map.put("2", 2);map.put("3", 3);map.remove("1");map.get("2");map.clear();Set set = new HashSet<>();set.add(1);set.add(2);set.add(3);set.remove(1);set.contains(2);set.clear();复制代码
Kotlin也有List,Set,Map,但Kotlin中的List,Set,Map都是不可修改的
上图红色代表编译错误。就是说Kotlin的List,Set,Map中没有可以修改集合的方法,是只读的。当然Kotlin还提供了可以读写的集合,分别是MutableList,MutableSet,MutableMap,这些集合有可以修改集合的方法。下面介绍一些Kotlin常用创建集合对象的函数: listOf:用于创建List对象
var list: List = listOf ()复制代码
setOf:用于创建Set对象
var set: Set = setOf ()复制代码
mapOf:用于创建Map对象
var map: Map= mapOf ()复制代码
mutableListOf:用于创建MutableListOf对象
var mutableList: MutableList = mutableListOf()mutableList.add(1)mutableList.add(2)mutableList.add(3)mutableList.remove(1)mutableList.get(2)mutableList.clear()复制代码
mutableSetOf:用于创建MutableSetOf对象
var mutableSet: MutableSet = mutableSetOf()mutableSet.add(1)mutableSet.add(2)mutableSet.add(3)mutableSet.remove(1)mutableSet.contains(2)mutableSet.clear()复制代码
mutableMapOf:用于创建MutableMapOf对象
var mutableMap: MutableMap= mutableMapOf()mutableMap.put("1", 1)mutableMap.put("2", 2)mutableMap.put("3", 3)mutableMap.remove("1")mutableMap.get("2")mutableMap.clear()复制代码
总结
本篇文章主要对比了Java跟Kotlin的基本语法在写法上的区别。会了基本语法,就等于踏出了从Java转到Kotlin的第一步。
参考文献:
、《Kotlin程序开发入门精要》 推荐阅读:更多精彩文章请扫描下方二维码关注微信公众号"AndroidCzh":这里将长期为您分享原创文章、Android开发经验等! QQ交流群: 705929135