从Java到Kotlin(二)

2018-02-27 11:30:52来源:https://www.jianshu.com/p/3c19b7e83ac3作者:四会歌神陈子豪人点击

分享


本篇文章主要对比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
}

注意上面出现了AnyAny是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语言中文站
推荐阅读:从Java到Kotlin(一)


更多精彩文章请扫描下方二维码关注微信公众号"AndroidCzh":这里将长期为您分享原创文章、Android开发经验等!
QQ交流群: 705929135












最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台