本篇文章主要对比 Java 跟 Kotlin 的基本语法在写法上的区别无论学习何种语言, 学习它的基本语法都是第一步
目录
一分号;
二定义变量常量
三字符串模板与字符串面值
四自动类型转换
五定义函数
六注释
七控制流
八集合
一分号;
在 Java 中, 使用分号; 标志一句完整代码的结束 在 Kotlin 中, 一句代码结束后不用添加分好
二定义变量常量
Java 定义变量时把数据类型放在前面, 变量名放在后面
- int a = 1;
- int b;
- b = 2;
Kotlin 用 var 定义变量, 把数据类型放在后面, 并用冒号: 隔开
- var a: Int = 1
- var b: Int
- b = 2
Java 用 final 定义变量, 把 final 放在数据类型前面
- final int a = 1;
- final int b;
- b = 2;
Kotlin 用 val 定义变量, 把数据类型放在后面, 并用冒号: 隔开
- val a: Int = 1
- val b: Int
- b = 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 = 0
- when (a) {
- 0 -> {}
- 1 -> {}
- else -> {}
- }
注意: when 语句在满足条件的分支执行后, 会终止 when 语句执行, 所以不用像 switch 语句那样每一个 case 都加上 break 如果很多分支需要用相同的方式处理, when 语句可以把多个分支条件放在一起, 用逗号, 分隔, 如下所示:
- var a = 0 when(a) {
- 0 - >{}
- 1,
- 2 - >{ // 如果 a=1 或 a=2, 执行该代码块}
- else - >{}
- }
when 语句还能像 if 语句那样作为表达式:
- var a = 1
- var 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 = 0
- while(i++ < 10){
- }
- do{
- }while(i++<10){
- }
八集合
Java 中的 List,Set,Map:
- List < Integer > integers = new ArrayList < >();
- integers.add(1);
- integers.add(2);
- integers.add(3);
- integers.remove(1);
- integers.get(2);
- integers.clear();
- Map < String,
- Integer > map = new HashMap < >();
- map.put("1", 1);
- map.put("2", 2);
- map.put("3", 3);
- map.remove("1");
- map.get("2");
- map.clear();
- Set < Integer > 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 < Int > =listOf < Int > ()
setOf: 用于创建 Set 对象
var set: Set < Int > =setOf < Int > ()
mapOf: 用于创建 Map 对象
var map: Map<String, Int> = mapOf<String, Int>()
mutableListOf: 用于创建 MutableListOf 对象
- var mutableList: MutableList<Int> = mutableListOf()
- mutableList.add(1)
- mutableList.add(2)
- mutableList.add(3)
- mutableList.remove(1)
- mutableList.get(2)
- mutableList.clear()
mutableSetOf: 用于创建 MutableSetOf 对象
- var mutableSet: MutableSet<Int> = mutableSetOf()
- mutableSet.add(1)
- mutableSet.add(2)
- mutableSet.add(3)
- mutableSet.remove(1)
- mutableSet.contains(2)
- mutableSet.clear()
mutableMapOf: 用于创建 MutableMapOf 对象
- var mutableMap: MutableMap<String, Int> = 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 语言中文站
来源: https://juejin.im/post/5a7ba5066fb9a063563106ef