(Kotlin 学习笔记的文档结构基本按照 Java 核心技术一书的目录排列)

基本程序设计结构

数据类型

数字

类型 宽度
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8

Char 类型

Kotlin 中字符类型为 “Char”,和 Java 中不同的是,Kotlin 中的 Char 类型无法作为数字使用。如果需要将 Char 类型转换为 Int 类型,则可以直接调用"toInt" 方法。

Boolean 类型

Kotlin 中的 Boolean 类型和 Java 中的一样,只有两个值truefalse

数据类型的表示方式

  • 字面常量十进制表示:1234,1234L(Long 类型)
  • 十六进制表示:0x1234ABCD
  • 二进制表示:0b00100010
  • 不存在八进制表示
  • Double 类型:123.45,123.45e10
  • Float 类型:123.45F/f
  • 使用"_"让数字更加易读
    • 1234_5678_9L
    • 0x12_34_56_78_AB
    • 0b11010010_01101001_10010100_10010010

变量的初始化

在 Kotlin 中存在有 2 种变量 varval。其中 var 表示的是“通常的变量”,val 则表示的是“不可变变量”,这可以类比 Java 中的 final 修饰的数据类型类型。

一切皆对象,所以不管是var还是val变量,都存在成员函数。而val变量不可变的本质就是它不存在 set 方法。所以,可以使用 var 去覆盖一个 val ,但是无法反过来为之。

Kotlin 中变量的初始化语句为:

val/var 变量名 : 变量类型 = 值,其中变量类型是可选的

需要注意的是,在 Kotlin 中不允许声明了一个变量但是却不去初始化它。

在 Kotlin 中,数据有以下的几种初始化方法:

val a :Int = 1 // 对变量 a 立即赋值
val b = 2 // 因为很容易推断出 b 的类型是 Int,所以变量类型可以省略,这种初始化方式后面使用时变量不可赋值为空
val b ?= null // 将 b 的值设置为 null(需要注意 Kotlin 是空类型安全的,每次使用之前需要判断是否为空)
val c = null!! // 将 b 的值强制设置为 null,则之后的代码不再做是否为空的安全检查
b.toLong // 会报错
c.toLong // 不会报错

运算符

隐式类型转换

因为表示的方法不同,较小类型的数据无法隐式转换为较大类型的数据。也就是说,无法在不同类型之间比较两个变量是否在“数值”上是否相等。另外,也不可以将较小类型的数据隐式赋值给较大的数据类型:

val a : Int ?= 1
val b : Long ?= 1
print(a == b) // 这里会产生一个错误, Int 类型和 Long 类型无法进行比较
/****************************************************************/
val a : Byte = 1
val b : Int = a // 错误,小的数据类型无法隐式装箱为大的数据类型,如果需要赋值应该写作: = a.toInt()

Boolean 类型的布尔运算

  • || :短路逻辑或运算
  • &&:短路逻辑与运算
  • !:短路逻辑非运算

字符串

在 Kotlin 中字符串使用 String 类型进行表示。字符串是不可变的。字符串默认拥有迭代器,可以使用 foreach 进行遍历。

和 Java 中的字符串有一处显然的不同点,那就是 Kotlin 中的字符串除了拥有转义字符的赋值方式外,还存在类似于 Python 中那种通过三个引号进行的赋值方法,其中被三个引号括起来的所有文字,都是所见即所得的。

val text = """
for (c in "foo")
print(c)
"""

在这种字符串的赋值方式中,还有一种方法,用于去除前导空格。

val text = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()

在上面的例子中,默认使用"|"作为边界的前缀,如果想要使用其他的符号作为前缀,则将对应符号的字符作为传输传递入 trimMargin 函数。

字符串模板

Kotlin 的字符串应该吸收了很多脚本语言的字符串处理特性。它可以包含有模板表达式。所谓的模板表达式,你可以将其看作是很短的一小段代码。模板表达式由 $ 符号开头,后面紧跟随一个名称。这里的名称可以是某一个变量名。如果需要执行一些比较复杂的表达式,则使用花括号将表达式扩起来共同作为一个名称。

val strA : String = "abcd"
val strB = "$strA.length is ${s.length}" // abcd.length is 4

流程控制

条件语句

条件语句的形式为:if (condition) statement。作为扩展,还有 if ... else语句和多个 if 语句嵌套。

fun max(){
val a = 1
val b = 2
if (a > b) {
retrun a
}else{
return b
}
}

和 Java 中有点不同的是,if 中的分支可以是代码块,最后的一个表达式就作为该块的值。那么,上面的例子就可以写作:

fun man(){
val a = 1
val b = 2
if (a > b){
a
}else{
b
}
}

另外,if语句还可以作为表达式使用:

val max = if (a > b) a else b

在上述语句中,变量 max 的值最终是多少,需要看变量 ab 的最终结果。

条件判断中的范围判断

在传统的 C 语言或者是一些其他的类似 C 的语言中,如果想要判断一个数是否在一个区间内,可能需要那么写:

if (i >= 5 && i <= 10) {
// do something
}

而在 Kotlin 中这一切就简化了许多:

if (i in 5..10) {
// do something
}

另外还有:

if (i !in 5..10) { if (!(i >= 5 && i <= 10))
// do something
}

循环语句

for 循环

需要注意的是,在 Kotlin 中,不支持那种 C 中的传统 for 循环。

使用迭代器

val items = lostOf("apple","banana","kiwi")
for (item in items) {
println(item)
}

使用索引

val items = lostOf("apple","banana","kiwi")
for (index in items.indices) {
println(${items[index]})
}

虽然不具备类似于 C 中那样的 for 循环,但是并不意味着 Kotlin 不可以实现那种需求:

for (i in 1..5) {	// for (int i = 1;i <= 5;i++) {print(i)}
print(i) // 12345
}

需要注意的是,这里的 1..5 左右都是闭区间的。

for (i in 5..1) {
print(i) // 错误,没有任何输出
}

类似上面代码展示的这样,是无法进行输出的。如果想要逆序输出,那么你需要使用函数downTo 替代..

for (i in 5 downTo 1) {
print(i) // 54321
}

以上的例子都是针对步长是1的情况,如果实际的步长不是1,那么需要使用 step 函数来指定步长:

for (i in 1..5 step 2) {
print(i) //1 3 5
}

另外,又有一些时候(大部分的时候)可能并不需要包括结束区间。那么,这时候需要使用到 until 函数来替代 ..

for (i in 1 until 5) {
print(i) // 1234
}

while 循环

同类 C 语言。

do...while 循环

同类 C 语言。

多重选择 (when)

Kotlin 中不存在 switch...case...这样的表达式,取而代之的是 when 语句。

最简的 when 语句如下:

when (x) {
1 -> print(1)
2 -> print(2)
else ->print("null")
}

其中的 x 的值将会作为判断的条件,此 when 语句会逐一比对条件,如果找到任一匹配的条件,则执行->之后的语句块然后退出。假如所有的条件都不匹配,则会执行else对应的语句块。

和之前的if语句一样,when语句可以作为单独的表达式使用,也可以作为一个语句使用。如果它作为表达式使用,则对应块的值会作为此 when 的值,而每一个语句块的值是由该块最后一条语句所决定的。另外就是如果作为语句使用,则必须包含有 else,除非编译器能够确定每一个分支都已经覆盖到了(比如对于 Boolean 类型,则条件应该是 true 和 false,如果已经包含了这 2 个分支,则可以不需要 else。当然,随手添加一个 else 语句并不是什么坏习惯)。

相对于传统的类 C 语言,when 语句的条件要宽松很多。除了是一个固定的值,还可以是表达式:

when (x) {
parseInt(s) -> print("s encodes x")
else -> print("s does not encode x")
}
////////////////////////////////////////////
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}

中断控制流程语句

Kotlin 学习笔记(一)的更多相关文章

  1. Kotlin学习笔记(9)- 数据类

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步! Kotlin学习笔记(1)- 环境配置 Kotlin学习笔记(2)- 空安 ...

  2. kotlin学习笔记-异常好玩的list集合总结

    不积跬步无以至千里,不积小流无以成江海 先看看Kotlin中for循环的遍历 fun testList(){ var StringVal = "12_12_13_15_a_b_c_d_yu_ ...

  3. Kotlin学习笔记

    Kotlin的注释 Kotlin 的代码注释和Java一模一样 Kotlin的运行方式也是先kotlinc生成字节码,再kotlin字节码 如果一行里面只有一条语句,那么可以不写分号.但如果打算在同一 ...

  4. 08_28学习笔记Kotlin

    08_28学习笔记Kotlin Kotlin语法 aoe : int=18: name : String ="name"; 函数的定义 fun 名称 (str:String) :S ...

  5. Kotlin for Java Developers 学习笔记

    Kotlin for Java Developers 学习笔记 ★ Coursera 课程 Kotlin for Java Developers(由 JetBrains 提供)的学习笔记 " ...

  6. 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势

    0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...

  7. Spring源码学习笔记9——构造器注入及其循环依赖

    Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...

  8. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  9. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

随机推荐

  1. Python的迭代器与装饰器

    '''迭代器:两个基本方法:iter()和next()迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合等第一个元素开始访问,直到所有的元素被访问结束,迭代器只能往前不会后退. 迭代器有两个基本 ...

  2. activemq的高级特性:消息持久订阅

    activemq的高级特性之消息持久订阅 如果采用topic模式发送的时候,mq关闭了或消费者关闭了.在启动的时候,就会收不到mq发送的消息,所以就会出现消息持久订阅. 消息持久订阅:第一:消息要持久 ...

  3. 使用babel插件集

    1).打开配置文件".babelrc",配置插件集,代码如下: { "presets":["latest"] } 2).安装babel插件集 ...

  4. jdk8新特性-stream

    一.什么是流stream 1.可理解为高级版本的 Iterator 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的. 2.单向,不可往复 数据只能遍历一次,遍历过一次后即用尽了,就好比 ...

  5. HTML标签速记整理W3C

    标题 <h1>段落<p>链接< href="">图像<img src="">自关闭元素,不需要结束标记换行标志& ...

  6. Business Unit Helper

    using System; using System.Linq; using Microsoft.Xrm.Sdk; using Microsoft.Crm.Sdk.Messages; using Sy ...

  7. 大数据学习--day17(Map--HashMap--TreeMap、红黑树)

    Map--HashMap--TreeMap--红黑树 Map:三种遍历方式 HashMap:拉链法.用哈希函数计算出int值. 用桶的思想去存储元素.桶里的元素用链表串起来,之后长了的话转红黑树. T ...

  8. 车道线识别/Opencv/传统方法

    车道检测(Advanced Lane Finding Project) 实现步骤: 使用提供的一组棋盘格图片计算相机校正矩阵(camera calibration matrix)和失真系数(disto ...

  9. spark执行命令 监控执行命令

    #!/bin/bash #/usr/hdp/current/flume-server/bin/flume-ng agent -c conf/ -f /usr/hdp/current/flume-ser ...

  10. Could not connect to '192.168.80.145' (port 22): Connection failed的解决办法(远程连不上xshell)

    问题状况表现1 这个问题一般是你 的什么配置影响了虚拟机的网卡网关设置!!!. 问题状况表现2 这个问题一般是你 的什么配置影响了虚拟机的网卡网关设置. 解决办法 网上的那些解决方案,我都试过,比如. ...