博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从Java到Kotlin(二)
阅读量:7009 次
发布时间:2019-06-28

本文共 5586 字,大约阅读时间需要 18 分钟。

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

注意上面出现了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 = 0while(i++ < 10){}do{  }while(i++<10){}复制代码

八、集合

Java中的List,Set,Map:

List
integers = 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

转载地址:http://gwxtl.baihongyu.com/

你可能感兴趣的文章
用QT搭建简单的播放器外壳
查看>>
索引设计指南
查看>>
Timus Online Judge 1057. Amount of Degrees(数位dp)
查看>>
jquery中关于表格行的增删问题
查看>>
分布式事务,EventBus 解决方案:CAP【中文文档】
查看>>
GUI进化--数据与界面分离
查看>>
三级菜单实例
查看>>
Teleport Pro使用教程
查看>>
C# 如何生成CHM帮助文件
查看>>
Java编程的逻辑 (93) - 函数式数据处理 (下)
查看>>
一对多多对多的建表原则
查看>>
Maven详解(四)------ 常用的Maven命令
查看>>
可视化之Berkeley Earth
查看>>
线性表的顺序存储结构之顺序表类的实现_Java
查看>>
Hadoop的namenode的管理机制,工作机制和datanode的工作原理
查看>>
AX88772B 驱动移植
查看>>
array
查看>>
背水一战 Windows 10 (60) - 控件(媒体类): Pointer 涂鸦板, InkCanvas 涂鸦板
查看>>
[转]Repeat Page Header on each Page for reports SSRS
查看>>
一次误报引发的DNS检测方案的思考:DNS隧道检测平民解决方案
查看>>