Kotlin Bootcamp 自学(2):Kotlin基础

目录

Kotlin Bootcamp 自学(2):Kotlin基础

前言

运算符与数据类型 (Operators and Types)

数值类型(Numerical Type)

练习使用数据类型

字符串(String)

比较条件和布尔值(Boolean)

比较符号

if...else...

关于空值(Nullability)

关于array, list, 和loop

List

Array

循环loop


此系列文章是博主在通过Kotlin官方的Kotlin Bootcamp for Programmers学习时记录的随笔。

博主之前接触过的编程语言主要有Python, C++, PHP,之前也有使用过Java的Springboot架构来编写一些项目内容。最近因为业务需要,需要接触安卓平台的开发,遂学习Kotlin。

该教程是基于IntelliJ IDEA为编译器的Kotlin教程。

前言

在上一篇文章Kotlin Bootcamp 自学(1):Hello Kotlin中,我们介绍了什么是Kotlin,如何安装IntelliJ IDEA和JDK,并且用Kotlin运行HelloWorld程序。本篇文章将着重介绍一些基础的Kotlin知识。

运算符与数据类型 (Operators and Types)

数值类型(Numerical Type)

同其他编程语言一样,Kotlin使用 +, -, *, / 来进行加、减、乘、除。

试着在REPL中分别执行以下每一行代码:

1+14-32*36/3    1.0/2.02.0*3.52*3.5

输出结果如下:

1+1
res0: kotlin.Int = 24-3
res1: kotlin.Int = 12*3
res2: kotlin.Int = 66/3
res3: kotlin.Int = 21.0/2.0
res4: kotlin.Double = 0.52.0*3.5
res5: kotlin.Double = 7.02*3.5
res6: kotlin.Double = 7.0

可以看到,Kotlin在数值类型运算中和Python时不同的。Python会使用/和//来区分非整除和整除,Kotlin则是继承了Java的特点,所有除法都是用“/”。刚刚从Python换到Kotlin的时候比较容易犯的错误如下:

#Python中"/"运算符的使用
7/2
3.5
//Kotlin中"/"运算符的使用
7/2
res10: kotlin.Int = 3

相对于Kotlin来说,Python对数值类数据的类型管理相对宽松。如果习惯了Python中的宽松用法,不用明确的数据类型声明,在Kotlin中很容易出现算术上的错误。

除了用+-*/进行符号运算,Kotlin还可以调用类方法来实现符号运算:

//plus()加法
3.5.plus(4)
res11: kotlin.Double = 7.5//div()除法
7.5.div(1.5)
res12: kotlin.Double = 5.0//minus()减法
2.4.minus(1.1)
res13: kotlin.Double = 1.2999999999999998//times()乘法
3.2.times(4)
res14: kotlin.Double = 12.8

在这里,Kotlin相当于将数字封装成了一个Object(如:2.4是一个Double类的Object),并调用了对应类的运算方法来进行运算。这种方法称为boxing(装箱?)

虽然boxing是一种可行的运算方式,但是官方不建议这种方法的使用。原因也很简单:被封装成object的数字占用的大小比单纯的数字更大,因此在效率上更低。

练习使用数据类型

在Kotlin中,我们可以使用val或者var来声明变量,比如:

val i = 3i
res16: kotlin.Int = 3

我们也可以在声明变量时声明它的数据类型,比如:

val i: Int = 3 //声明变量i为Int类型i
res16: kotlin.Int = 3

既然可以提前声明变量数据类型,那么赋值时的数据类型就要对应:

这里我们把3.0(double类型)赋给Int类型的变量m,发生了错误

如果我们不能像python一样通过赋值的方式把Double转化成Int,那要怎么操作呢?

Kotlin中数据类型转化的方法为to()

例子如下:

如果我们想把变量i转化成byte类型:

val i: Int = 6val bi = i.toByte()bi
res20: kotlin.Byte = 6

Kotlin还允许在数字中间添加分位符以方便阅读(比如一百万的阿拉伯数字表示是1,000,000):

val oneMillion = 1_000_000oneMillion
res26: kotlin.Int = 1000000val socialSecurityNumber = 999_99_9999LsocialSecurityNumber
res28: kotlin.Long = 999999999

在以上的例子中,我们所有的变量声明都是用了val这个关键词(对应英文value,指“值”)。Kotlin还提供了另一种声明变量的方式,即关键词var(对应英文variable,指“变量”)。从两者的含义中可以看出,似乎只有var关键词才对应“变量”这个词。

事实也确实如此。valvar最大的区别就在于:val是不可变变量,var是可变变量。

要如何理解呢?val更像是我们常说的final变量,即一旦声明,就不能二度赋值改变:

(当然,如果是再次输入val oneMillion = 999_999的话,oneMillion的值会变成999999。但是个人认为这样并不是对同一个变量重新赋值,而是删除旧变量后新建了一个变量。在后面关于指针的章节中,会详细解释)

字符串(String)

Kotlin中的字符串和大部分语言的字符串相同,' '表示单个字符(char)," "表示一串字符(String),+可以拼接字符串。字符串模版中调用字符串变量可以使用$字符(类似Javascript)。

比较条件和布尔值(Boolean)

比较符号

Kotlin的比较符号格式与大部分语言相同:>, <, ==, <= >=, !=。

**值得一提的是,Kotlin也支持字符进行比较(如"A" < "a")。具体数值大小请参考ASCII码。

if...else...

if else判断句的格式基本上和Java一样:

val numberOfFish = 50
val numberOfPlants = 23
if (numberOfFish > numberOfPlants) {println("Good ratio!")
} else {println("Unhealthy ratio")
}

输出:

Good Ratio!

在if条件中也可以使用range:

val fish = 50
if (fish in 1..100) {println(fish)
}

输出:

50

在多个逻辑判断时,可以用&&(and),||(or)来表示对应逻辑,同样else if也适用于Kotlin:

if (numberOfFish == 0) {println("Empty tank")
} else if (numberOfFish < 40) {println("Got fish!")
} else {println("That's a lot of fish!")
}
That's a lot of fish!  //由于之前定义的numberOfFish是50,所以执行最后一个判断条件

以上的if else判断条件可以由关键字when来代替:

when (numberOfFish) {0  -> println("Empty tank")in 1..39 -> println("Got fish!")else -> println("That's a lot of fish!")
}
That's a lot of fish!

关于空值(Nullability)

在我们的第一章中提到过,Kotlin是一个对空值管理很严谨的语言。那具体体现在哪些方面呢?

首先,我们试着给一个Int变量赋值null:

可以看到报错显示null不能赋给非空类型(non-null type)Int。

如果想要说明某个变量可以被赋值为null,则需要添加"?"

var i: Int? = null
//以上代码不报错

如果有复杂的数据结构,比如list:

可以通过规定list可否有空值来限定list中的数据可否为null。如List<String?>代指可以出现空值的字符串list,List<String>则是不可有空值的字符串list。但是两个List可以为空:

关于更多Null Safety的讨论,后续几章会涵盖。同时官方也给出了较为详细的解释:Null safety | Kotlin

如果我们想对某个数据类型的变量进行方法调用,如果该变量值为null,则会出现错误。比如我们之间提到的Int类型:

这里Kotlin提示我们正在用不安全的方法对一个可能为空的变量进行操作。如果想要对一个可能为空的变量进行方法调用,应该同样使用"?"来修饰方法:

图中?.的作用即是告诉系统该变量可能为空。如果为空,则不会执行dec()操作。在dec()后的?:则是常见的三目操作符(the Elvis Operator)。即:如果?:前为可执行操作或True,就执行?:前的操作,否则执行?:后的操作。

值得注意的是,如果想通过以下代码实现上面的三目操作符语句会报错:

var numNull: Int? = nullif (numNull != null) {numNull = numNull.dec()}else{numNull = 0}
//error: smart cast to 'Int' is impossible, because 'numNull' is a mutable property that could have been changed by this time
//    numNull = numNull.dec()
//            ^

报错中指出,这个赋值的操作无法保证正确运行,因为numNull的类型为Int?,所以在第一个非空判断之后,numNull实际上仍有可能会出现值变为null的情况。因此普通的赋值在此处仍有出现NPE(Null Pointer Exception)的可能。numNull.dec()是错误的原因,因此要修改为numNull?.dec()。

**如果,如果,你真的很喜欢看到NPE,你可以使用!!符号来强制将任何数值转化成非空数值类型。

关于array, list, 和loop

List

通过listOf()指令来声明一个不能变动的list。

val school = listOf("Harvard", "PKU", "Tsinghua")

具体不能变动的表现如下:

如果想要使一个list可以变动的话,应使用mutableListOf():

val mutableSchool = mutableListOf("Harvard", "PKU", "Tsinghua")

Array

Array不同于List,它的大小是在声明时就被固定的,因此无论如何Array都不可以被添加或删除元素,除非是将原来的array赋值到一个新的array上。

Array中的元素没有给明确的类型限制,所以可以出现String和Int混用的情况:

当然,你也可以声明规定一个array中的数据类型:

用"+"可以将两个array组合到一起

List和Array可以组合使用:

可以看到,输出结果中出现了一串地址。这里是因为我们没有使用java.util.Arrays.toString来表示Array。List的输出则没有问题。

Kotlin也允许通过直接声明Array大小来新建Array:

以上代码中,it代表array index。{}中的内容为初始化array时的操作

循环loop

for循环:

val school = arrayOf("shark", "salmon", "minnow")
for (element in school) {print(element + " ")
}

输出:

shark salmon minnow 

for循环中元素和索引同事输出:

for ((index, element) in school.withIndex()) {println("Item at $index is $element\n")
}

输出:

var bubbles = 0//while循环while (bubbles < 50) {bubbles++}println("$bubbles bubbles in the water\n")//dowhile循环do {bubbles--} while (bubbles > 50)println("$bubbles bubbles in the water\n")//repeat循环repeat(2) {println("A fish is swimming")}

输出:

50 bubbles in the water
49 bubbles in the water
A fish is swimming
A fish is swimming

以上便是Kotlin Bootcamp中第二章节的内容。第二章中主要介绍了Kotlin中赋值、空值管理、循环等相关的知识。第三章中,会着重介绍函数相关的内容。

感谢阅读。

2022/6/4

Edward

Kotlin Bootcamp 自学(2):Kotlin基础相关推荐

  1. Google 重申对 Kotlin 编程语言 Android 的承诺:谷歌推出 Kotlin 免费在线课程 Kotlin Bootcamp Course 1

    Google 重申对 Kotlin 编程语言 Android 的承诺:谷歌推出 Kotlin 免费在线课程 Kotlin Bootcamp Course 1 Kotlin Bootcamp Cours ...

  2. Google 重申对 Kotlin 编程语言 Android 的承诺:谷歌推出 Kotlin 免费在线课程 Kotlin Bootcamp Course 2

    Google 重申对 Kotlin 编程语言 Android 的承诺:谷歌推出 Kotlin 免费在线课程 Kotlin Bootcamp Course 2 5.1 扩展函数 In this code ...

  3. Kotlin学习之起始篇—基础语法

    Kotlin学习之起始篇-基础语法 Kotlin被Android接纳为官方语言已经一年多了,现在才开始学习,实在惭愧.希望能一点点进步,到最后能完全用Kotlin开发app.废话就不多说了.Let's ...

  4. kotlin编程语言_Kotlin初学者编程基础

    kotlin编程语言 什么是Kotlin? (What is Kotlin?) Kotlin is a programming language developed by Jetbrains, the ...

  5. 疯狂kotlin讲义连载之Kotlin的基础类型--字符串

    Kotlin使用String类型字符串.字符串表示一个有序的字符集合,例如在前面代码中看到的"fkit.org"."crazyit.org"等代表字符串,Str ...

  6. 手把手教你学Kotlin (1): JetBrains的Kotlin Educational Tool下载、安装和 Kotlin Koans的安装和使用

    文章目录 前言 1.Kotlin Educational Tool下载.安装 2.Kotlin Koans的安装和使用 前言 此教程面向没有Kotlin基础的程序员或者学生 1.Kotlin Educ ...

  7. Kotlin 函数式编程(Kotlin Functional Programming)

    Kotlin 函数式编程 (Kotlin Functional Programming)     陈光剑 1. 函数式概述 6 1.1. 函数式简史 6 1.2. 函数式编程语言家族 7 1.2.1. ...

  8. Kotlin第一弹:Kotlin详细介绍

    会一直坚持写关于Kotlin的入门系列文章,赶紧关注一起学习吧! 目录 前言 Kotlin是什么? 一.为什么优先使用Kotlin进行Android开发? 二.Kotlin优先意味着什么? 三.Kot ...

  9. kotlin跨平台_探索Kotlin跨平台第1部分

    kotlin跨平台 介绍 (Introduction) Kotlin makes Android development more fun. If you search the web, you'll ...

最新文章

  1. andriod访问网络出现NetworkOnMainThreadException解决方法
  2. PyQt5多线程的执行和停止
  3. 文本匹配开山之作--双塔模型及实战
  4. python实现web服务器_python实现web服务器
  5. Android进阶: 10分钟实现NDK-JNI 开发教程
  6. life words
  7. java 暂停_面试官问我:平常如何对你的Java程序进行调优?
  8. 5.4 self-attention以及mask操作的实现
  9. 时域采样定理MATLAB实现
  10. C/C++复习:向量的数量积
  11. 注释//TODO的作用
  12. matlab 函数定义 属性,matlab class()函数类定义技巧
  13. 强引用置为null,会不会被回收及内存分配及年轻代年老代算法回收
  14. 命令行下将Debian10升级为Debian11
  15. 安卓的平板电脑,请问有没有类似Ghost的备份还原软件?(for 安卓)
  16. qt5 qtablewidget 某一列下划线可修改_2021年中小学寒假时间安排一览表(内附期末考复习攻略,可打印!)...
  17. java 给excel添加一列_java操作excel在开始位置添加一列
  18. 对抗网络之PG-GAN,无条件下生成更真实的人脸图像[3]
  19. Jmeter(三) - 从入门到上天 - 常用原件 (详解教程)
  20. DSP—2812、28335串行通信接口SCI

热门文章

  1. 随机数写excel java代码_基于python实现在excel中读取与生成随机数写入excel中
  2. 显示器显示超频解决办法
  3. 2019深圳学区房划分_查查吧学区房地图
  4. 维特智能蓝牙5.0加速度计陀螺仪传感器倾角电子罗盘磁力计仰卧起坐
  5. 常见笔顺错误的字_那些我们易错笔画笔顺的常见字
  6. gitlab pipelines 使用
  7. Freemarker简单实现一个代码生成器。
  8. sudo pip install -i https://pypi.douban.com/simple --user MySQL-python报错‘my_config.h‘ file not found
  9. Sami Haddadin:研发「会痛」机器人,让人机交互更安全|42问AI与机器人未来
  10. 新能源汽车核心技术-VCU硬件在环(HiL)仿真测试系统