kotlin学习笔记-2-基础语法
2017-10-07 16:26
579 查看
1.基本类型
数字Number
kotlin中数字与java类型,但是也有所区别,比如数据不能自动展开(int 数字可以作为long使用),字面值有时候也不太一样,另外字符不是数字。kotlin中数字类型如下,与java基本一致
类型 | 宽度 |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
数字字面值
常见数字字面值如下:十进制:如123,可以在后面添加大写L代表Long类型,如123L
十六进制:如0x0f
二进制:如0b00111100
八进制:kotlin不支持
Double类型:如123.5,123.5e10
Float类型:后面添加f或者F,如123.45f
自kotlin 1.1开始,数字字面值中可以添加下划线增强可读性,比如
var bytes = 0b11001100_00100100_10010011
Representation
数字可以通过对象引用或者泛型实现自动装箱,注意数字装箱后与原数字是相等的,但是同一个数字的多个装箱后对象不一定相等var a:Int = 100 print(a === 100) // true var boxedA:Int? = a var anotherBoxedA:Int? = a print(boxedA === anotherBoxedA) // 结果不可靠
显式转换
较小类型不会自动转换为较大类型,比如我们将Byte转换为Int需要显式转换var b:Byte = 1
var i:Int = b.toInt()
每个数据类型支持如下的显式转换方法:
toByte()
toShort()
toInt()
toLong()
toFloat()
toDouble()
toChar()
在算术运算中存在隐式转换,如
var i = 1L + 2
操作符
kotlin支持标准的数字运算。位运算有相应的方法,通常使用括号括起来。比如
var x = (1 shl 2) and 0x000ff000
以下是完整的位运算操作符
shl:带符号左移(类似java中的<<)
shr:带符号右移(类似java中的>>)
ushr:无符号右移(类似java中的>>>)
and
or
xor
inv()
Float类型比较
针对Float类型的数据比较主要有三种操作相等性比较: a == b
比较操作符比较: a > b
范围的创建和检查: a..b x in a..b
通常,在操作数都是Float和Double类型时,以上操作都是遵循ieee 754标准的。
然而,有些时候操作数并不确定类型,比如Any,Comparable<..>,以上的操作会使用Float和Double类的equals和compareTo方法来判断,有些地方与标准不太符合,比如
NaN与它自身相等
NaN大于其它所有特殊符号(element),比如无穷大
-0.0小于0.0
字符Character
由Char类修饰,注意与java不同的是,kotlin中Char不可以作为数字使用Char字面值的表示与java基本一致,常见为三种,1为单引号括起来,2为转义字符,3为unicode字符,分别如下
'a' \t '\uFF00'
调用toInt可以将Char转化为数字,如
‘1’.toInt()
Boolean
与:&&或:||
非:!
集合Array
可以使用库函数arrayOf构造Array,如arrayOf(1, 2, 3)
也可以使用带size和生成每个元素的function的工厂方法来构造,如
val asc = Array(5, {i -> (i*i).toString() } )
针对基础类型的array,kotlin提供了对应的构造类和构造方法,比如ByteArray,IntArray等。
var x: IntArray = intArrayOf(1, 2, 3) //构造集合的方法
String
字符串由类String来描述,其元素为Char,可以通过index来访问,也可以通过for循环来遍历var s = “Hello” var c = s[2] for (c in s) { println(c) }
字符串字面值
字符串字面值有两种,转义字符串与原始字符串转义字符串和java中字符串类似,其中带有转义字符,如
var str = “Hello, world!\n”
原始字符串由三引号括起来,其中不包含转义字符,可以包含换行或者其他字符,同时可以使用trimMargin函数移除每行前面的空白leading whitespace,默认|标记行首
var text = """ |This is the first line. |This is the second line. """.trimMargin()
字符串模板
在字符串模板中,一段代码可以先计算出值然后拼接到字符串中,有两种方式,一种为$字符后跟变量名,如var i = 10
var str = “i=$i”
另一种方式为$后添加大括号,大括号中可以是任意表达式
var s = “abc”
var str = “s.lengthis{s.length}”
2.包package
import包名可有可无import语句可以用来导入类,顶层function和properties,enum常量,针对import后名称有重复的,可以采用as语句调整本地名称,比如
import abc.Aclass as Bclass
3.流程控制
if
和java中类似,可以作为语句,也可以作为表达式,当作为表达式的时候用于直接返回数据,而且需要有else关键字var result = if (a > b) a else b
when
类似C语言当中的switch语句,顺序匹配各个条件,直到匹配或者到达else,其中条件不一定是常量,可以是判断语句,比如when(x) { in 1..10 -> println(“x in range of 0 to 10”) is String -> println(“x is String”) else -> println(“else”) }
如果期望多个条件condition执行同一个语句,只需要将condition用,分隔即可。
when语句可以用作表达式,比如
fun hasPrefix(x: Any) = when(x) { is String -> x.startWith(“prefix”) else-> false }
当when不带参数时,类似普通的if else语句,会执行首次condition满足的语句。
for循环
for语句用于循环迭代数据, 其格式如下for (item in collection) println(item)
后面通常接语句块。
遍历集合的同时访问index
for (i in array.indices) { print(array[i]) }
while循环
while和do while与java类似while(condition) { statement } do { statement } while(condition)
4.跳转
三个关键字,return break 和continue,与java使用基本一致,return针对function,break和continue针对循环,默认均为跳出最内层的function或者loop。语句前面可以添加label,用于定位,语法为label后面紧跟@字符。使用lable可以改变return break continue的默认行为。
// 当j为10时会跳转到外层循环,使用continue类似。 abc@ for(i in 1..100) { for (j in 1..100) { if (j == 10) break@abc } }
在使用return 时,如果有嵌套function,如果内部function为lambda表达式,则return 到外部funtion。想要跳转到内部function有三种方式,第一种为给lambda表达式添加label,并return到label,比如
fun foo() { ints.forEach lit@{ if (it == 0) return@lit //跳转到lit,而不是foo println(it) } }
第二种为跳转到隐式label,上面例子中lambda表达式所在函数存在隐式label,即forEach,所以可以这样写
fun foo() { ints.forEach { if (it == 0) return@forEach //跳转到forEach,而不是foo println(it) } }
第三种方式为将lambda表达式调整为匿名function,此时return默认跳转出内部的匿名function
fun foo() { ints.forEach (fun(value: Int){ if (value == 0) return //跳出匿名function println(value) }) }
如果希望添加label的同时有返回值,只需要与正常一样写即可
return@lit 1
相关文章推荐
- Kotlin学习笔记1-1 入门-语法基础
- Kotlin学习笔记-基础语法
- Kotlin基础语法学习笔记
- Kotlin 入门基础语法学习笔记
- Kotlin学习笔记之基础语法
- Kotlin 博客 基础语法学习笔记
- Kotlin 学习笔记(二)—— 基础语法
- Kotlin学习笔记一基础语法
- Javascript学习笔记(一) -- 基础语法
- Python 基础语法学习笔记
- javascript基础语法学习笔记
- 学习笔记_JavaSE_02_Java基础语法01
- PHP学习笔记01——基础语法
- 学习笔记之javaweb基础:jsp基本语法,内置对象,对JavaBean的操作语法
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
- 第四天02 JAVA基础语法(流程控制)(学习笔记)
- JAVA学习笔记——JAVA基础语法之精华
- Python学习笔记(一)基础语法
- Python学习笔记(一)基础语法
- 【C语言学习笔记】基础语法及基本运算