Kotlin-基础

首先Kotlin是可以运行再JVM中的,因为Kotlin可以编译成class,可以调用Java的库,有一定的关联程度。但是本质上上来说还是一门不同的语言,这一点要清楚。不要生硬去联想对应是Java的什么什么的。当然会有一定的关联,但那都是熟练之后考虑的事情。

hello wrold!

1
2
3
fun mian(args: Array<String>) {
println("hello world!")
}

首先kotlin文件main函数的入口不需要定义类,充分说明了kotlin是支持函数式编程的。

现代化语言不需要分号分隔行结尾

函数声明方式是形如

1
2
3
fun funName(argName: ArgType): ReturnType {
//
}

变量声明,采用后置形式,反正有关类型定义都是后置。不论是形参变量、变量、函数变量

1
2
fun setName(name: String){}//形参变量后置声明
var num: Int = 10

基本类型

Kotlin的所有东西都是对象,基础类型也是对象。所以基本类型也是可以调用成员函数的。

数字

  • Byte 1字节
  • Short 2字节
  • Int 4字节
  • Long 8字节
  • Float 4字节
  • Double 8字节
1
2
3
4
val one = 1//Int
val threeBillion = 3000000000//Long
val oneLong = 1L//Long
val oneByte: Byte = 1//完整声明
  1. 首先量的声明有val表示value值,也就是常量,var表示variable值,也就是变量。
  2. 量的类型可以根据右值进行自动推断。浮点值默认推断为Double,整数默认推断Int除非超过范围推断为Long,其它需要自行类型约束
  3. 给值添加后缀表示类型FL

字面量

1
2
3
4
val a = 10//十进制	
val b = 0xF//16进制
val c = 0b1111//二进制
val d = 100_000_000L//下划线分割便于阅读

tips:无八进制

表达方式

Kotlin默认类型是非空,就是不可以为null。但是JVM原生类型是可以为空的

1
val boxA: Int? = 10//通过再类型加上?表示为可空类型

转换

kotlin不会隐式拓宽的,再运算式内会拓宽,这一点编程语言基本一致

1
2
3
4
5
6
7
8
fun test(num Double) {
println(num)
}
fun mian() {
val i = 1
test(i)//不匹配
}
val l = 1L + 3//Long + Int => Long

显示转化

直接使用toXXX即可

1
2
val a: Int = 6
val b: Long = a.toLong()

位运算

1
2
3
4
5
6
7
8
9
10
11
shl //有符号左移
shr //有符号右移
ushl //无符号左移
ushr //有符号右移
and //位与
or //位或
xor //位异或
inv //位非
val a = 6
a.shr(3)//函数式
a shlr 3//中缀式

其实都是中缀函数

字符

1
2
3
val a: Char = 'a'
val b: Char = '\n'//转义
val c: Char = '\uFF00'//Unicode转义

布尔

仅用truefalse

1
val a: Boolean = true

逻辑操作符

  • || 短路或
  • && 短路与
  • !逻辑非

数组

在kotlin中数组使用Array类表示

1
2
3
4
5
6
7
class Array<T> private constructor() {
val size: Int
operator fun get(index: Int): T
operator fun set(index: Int, value: T): Unit
operator fun iterator(): Iterator<T>
// ……
}

使用set、get函数设置或获取,同时可以运算符重载语法

1
2
3
4
val array = Array(5){x->x}//通过new对象传入lmbda表达式进行构建对象
val array2 = arrayOf(1,2,1,3);//通过工厂方法进行构建对象
println(array[1])
println(array.get(1))

原生数组类型

当然Java中是存在非类基本数值,Kotlin中也有对应的原生数组,通过相应的工厂方法进行构建

它们对应的类型是IntArrayShortArray等,它们和Array是不存继承关系的,对应着原生数组类型

1
val array = intArrayOf(1,2,3)

字符串

字符串字面值

普通,存在转义

1
val stringA = "hello world! \n"//可以存在转义字符

原始字符串,无转义,使用三引号包围,里面是怎么样表现的,输出就是怎样的。

1
2
3
4
5
val stringB = """
fun mian() {
println()
}
"""

输出

1
2
3
4

fun mian() {
println()
}

当然是可以修剪trim,trimMargin通过特定字符裁剪,trimIndent缩进裁剪

字符串模板

加上$后在字符串中可以表现位一个变量使用了,复杂情况下使用括号限定,因为$在模板里属于特殊符,想要打出来就如下。

1
2
3
4
5
6
7
8
val a = 10
val str = "a = $a"
println(str)//output => a = 10
val s = "abc"
val sArray = "$s.length is ${s.length}"
println(sArray)//output => abc.length is 3
println("$")//output => $
println("${'$'}")//output => $

虽然Java里面没有这个,PHP中倒是用的不少,所以有些亲切,反正各个语言基本上都有那么几个相似的地方。

包和导入

这个就基本和Java一样了。不过Java没有别名语法,kotlin理由

1
import org.example.Test as MyTest

控制流

特别注意,在kotlin中ifwhen不只是控制结构,同时也是表达式

if

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//普通用法
val a = 3
if (a > 3) {
println("大于3")
}
//表达式用法,表达式用法必须含有`else`
println(if(a > 3) "大于3" else "小于3")
//表达式用法,最后一行作为返回值

val max = if(a > 3) {
println("大于3")
a + 1
} else {
prntln("小于3")
a + 1
}

when

其实也就是分支符switch一样的功能

1
2
3
4
5
6
7
8
9
10
when(x) {
1 -> println("1")
2 -> println("2")
3,4 -> {
println("3 or 4")
}
else -> {
println("else")
}
}

分支条件不一定是常量

1
2
3
4
5
6
when(x) {
parseInt(b) -> println("使用函数")
in 1..10 -> println("使用区间")
!in 10..20 -> println("区间")
is Int -> println("类型判断")
}

甚至可以进一步简化

1
2
3
when {
a is Int -> println("")//只要产出true值就可以分支选择
}

表达式,和if表达式使用类似,也是必须要要else结构

1.3后when括号里面可以声明变量,并且用于when作用域

1
2
3
4
5
fun Request.getBody() =
when (val response = executeRequest()) {
is Success -> response.body
is HttpError -> throw HttpException(response.status)
}

for

1
2
3
4
5
6
7
8
9
for (item in items) //对迭代器迭代
for (num : Int in nums) //数组迭代
for (i in 1..3) //开区间
for (i in 1 until 3) //前开后闭区间
for (i in 10 downTo 0 step 2)//倒序,带步长
for (i in array.indices) {//索引遍历
println(array[i])
}
for ((index, value) in array.withIndex)// 索引和值遍历

while

这个就是老套路

1
2
3
4
5
6
while(x > 2) {
//
}
do {
//
} while(x > 2)

返回与跳转

return

break

continue

标签返回

1
2
3
4
5
loop@ for (i in 1..100) {
for (j in 1..100) {
if (……) break@loop
}
}