基本语法
第一部分:2018年5月10日16:26:27
定义函数
fun 特定关键词
sum 方法名
vararg 可变参数类型
var 变量类型
Int 整型
返回数据
fun sum(vararg i: Int): Int {
var sum = 0
for (j in i.indices) {
sum =sum+i[j]
}
return sum
}
两个参数,返回两个数据之和
fun sum(a: Int, b: Int): Int {
return a + b
}
方法返回数据为空 Unit可以省略不写
fun out(s: String): Unit {
println(s)
}
数据类型
val 一次赋值的局部变量 类似变量加上final
var 变量
可以推断变量类型
var a=0
a=10
val b=10
var c:String="Hello"
val d:Int=10
注释
有单行注释,块注释;可以嵌套
/*
LogUtil.out(a)
/*LogUtil.out(a)
LogUtil.out(a)*/
LogUtil.out(a)
*/
//LogUtil.out(a)
使用字符串模板
${} 调用方法 $a 变量可以不用{} 使用字符串形式
print("Hello World ${MathUtil.sum(1, 2, 4, 4)} and ${sb.name}")
使用条件表达式
直接返回结果,也可以使用常规方法
fun minOf(a:Int,b:Int)=if(a<b) a else b
使用可空值
toIntOrNull()当类型不是数字类型时候返回null,Int? 空检测
fun parseInt(s:String):Int?{
return s.toIntOrNull()
}
fun printProduct(s1:String,s2:String):Int{
val s1=parseInt(s1)
val s2= parseInt(s2)
if(s1==null){
return 0
}
if(s2==null){
return 0
}
return s1*s2
}
toIntOrNull方法源码
@SinceKotlin("1.1")
public fun String.toIntOrNull(radix: Int): Int? {
checkRadix(radix)
val length = this.length
if (length == 0) return null
val start: Int
val isNegative: Boolean
val limit: Int
val firstChar = this[0]
if (firstChar < '0') { // Possible leading sign
if (length == 1) return null // non-digit (possible sign) only, no digits after
start = 1
if (firstChar == '-') {
isNegative = true
limit = Int.MIN_VALUE
} else if (firstChar == '+') {
isNegative = false
limit = -Int.MAX_VALUE
} else
return null
} else {
start = 0
isNegative = false
limit = -Int.MAX_VALUE
}
val limitBeforeMul = limit / radix
var result = 0
for (i in start..(length - 1)) {
val digit = digitOf(this[i], radix)
if (digit < 0) return null
if (result < limitBeforeMul) return null
result *= radix
if (result < limit + digit) return null
result -= digit
}
return if (isNegative) result else -result
}
类型判断
在判断类型的域中,或者判断语句之后,不需要转化类型了,可以直接使用相关方法; is 属于 !is 不属于
fun e(obj: Any) {
println("===========================S==============================")
if (obj is String) {
println("字符串长度"+obj.length+" "+obj)
}
if(obj !is String){
println("" + obj)
}
println("===========================E==============================")
}
使用for循环
in [0,30] 都包含在内
for(i in 0..30){
println(i)
}
arrayOf 类似于集合,可接受不同类型,不同长度的功能;
//public inline fun
indices 范围,尺度
val arr=arrayOf("1","2",3,false,"Hello World")
for(i in arr.indices){
println(arr[i])
}
使用while循环
var index=0
while (index<arr.size){
index++
print("Hello ")
}
使用when
有点类似 switch case 语句 ; 适配到一个就结束,默认使用 else
fun main(args: Array<String>) {
val arr = arrayOf("1", "2", 3, false, 4.5)
for (i in arr.indices) {
when (arr[i]) {
"1" -> println("字符串数字1")
is String -> println("String 类型")
is Boolean -> println("布尔 类型")
is Int -> println("整数 类型")
3 -> println("数字3")
else -> println("UnKnown")
}
}
}
输出结果
字符串数字1
String 类型
整数 类型
布尔 类型
UnKnown
使用区间 (range)
in 在区间之内
for (i in 0..10) {
println("i:"+i)
}
step 步长
for (i in 0..20 step 5 ) {
println(“i:” + i)
}
输出
i:0
i:5
i:10
i:15
i:20
downTo 减少
for(x in 27 downTo 9 step 2){
println("x=$x" )
}
输出
x=27
x=25
x=23
x=21
x=19
x=17
x=15
x=13
x=11
x=9
until 【0,10)
for (x in 0 until 10) {
println("$x====")
}
输出
0====
1====
2====
3====
4====
5====
6====
7====
8====
9====
!in 在区间之外
Random().nextInt(1000) 产生一个1000之内的整数
val s = Random().nextInt(1000)
if (s !in 10..100) {
println("$s 不在10到100之内...")
} else {
println("$s 在10到100之内...")
}
使用集合
listOf 转换成一个集合,遍历 for(item in list)
//public fun
val list = listOf("1", 2, 3.0, true)
println(list.get(0))
for(item in list){
println(item)
}
ArrayList
val mList = ArrayList<Any>()
mList.add(1)
mList.add("2")
mList.add(3.0)
mList.remove(1)
mList.add("22")
for (i in mList.indices) {
println("第${i}个数据:${mList[i]}")
}
HashMap
val map = HashMap<String, String>()
map.put("one", "1")
map.put("two", "2")
map.put("three", "3")
for (key in map.keys) {
println("键值对 ${key} :${map.get(key)}")
}
输出结果
1
1
2
3.0
true
第0个数据:2
第1个数据:3.0
第2个数据:22
键值对 one :1
键值对 two :2
键值对 three :3
新方式遍历map
val map = HashMap<String, String>();
map.put("one", "1")
map.put("two", "2")
for ((x, y) in map) {
println("$x====$y")
}
初始值,map2不可变
val map2 = mapOf("1" to "one", "2" to "two", "3" to "three")
for ((m, n) in map2) {
println("$m--->$n")
}
lambda表达式
对集合数据进行筛选、整合、排序等,很好、很强大
val f = listOf("black1", "red1", "white", "black2", "red2", "black7", "black2", "black6")
f.filter { it.startsWith("b") || it.startsWith("r") }
.map { it.toUpperCase() }
.sortedBy { it }
.forEach { println(it) }
输出結果
BLACK1
BLACK2
BLACK2
BLACK6
BLACK7
RED1
RED2
if not null 缩写 ?
此时我D盘有文件夹”1”不存在文件夹”Test”
val files = File("D://1").listFiles()
println(files?.size)
val files2 = File("D://test").listFiles()
//println(files2?.size)
println(files2.size)
输出结果
3
Exception in thread "main" java.lang.NullPointerException
at HelloKt.main(hello.kt:38)
if null 缩写 ?:
val s1 = null
val email = s1 ?: "数据为空!"
val s2 = "qishuichixi@126.com"
val emai2 = s2 ?: "数据为空!"
println("email:${email} emai2:${emai2}");
输出
email:数据为空! emai2:qishuichixi@126.com
if not null else 缩写 ? ?: 相当于将null 转成 其他处理
val files = File("D://1").listFiles()
println(files?.size ?: "empty")
val files2 = File("D://test").listFiles()
println(files2?.size ?: "empty")
输出结果
3
empty
if not null 缩写 ?.let 如果不为空则执行
val s1 = null
val email = s1
val s2 = "qishuichixi@126.com"
val emai2 = s2
//不为空
email?.let {
println("email不为空....")
}
//不为空
emai2?.let {
println("emai2不为空....")
}
輸出
emai2不为空....
基本内容
第二部分: 2018年5月10日16:29:28
基本类型
数字
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8
在kotlin中字符不是数字
字面常量
十进制: 123 123L 123.5 123.5e10 123.5F
十六进制: 0xAF22
二进制: 0b1000101010
不支持八进制
数字字面值中的下划线
val l = 1_000_000
val l1 = 1234_1234_5478_7895L
val l2 = 0xFF_EE_5E
val l3 = 0b10001010_000111001_00011100
LogUtil.all(l, l1, l2, l3)
更加易读
输出
===========================S==============================
1000000
1234123454787895
16772702
18102556
===========================E==============================
打印方法
fun all(vararg any: Any) {
println("===========================S==============================")
for (a in any) {
println(a)
}
println("===========================E==============================")
}
显示转换
较小类型的隐式转成较大类型,可以通过显示转换来拓宽数字
val a: Int? = null
val b: Int? = 20
//错误写法
//val c:Long?=b
val c: Long? = b?.toLong()
val d: Long? = a?.toLong()
LogUtil.all(c, d)
输出
===========================S==============================
20
null
===========================E==============================
Long+Int=Lont
val x: Int = (3L + 1).toInt()
val y = 3L + 12
println(x)
println(y)
每个数字类型支持如下转换
toByte() Byte
toShort Short
toInt Int
toLong Long
toFloat Float
toDouble Double
toChar Char
运算
import com.qishui.util.LogUtil
fun main(args: Array<String>) {
// 错误 没有>> << >>>等
// val x1=1>>2
//左移2位 2^3
val x2 = (1 shl 3)
//右移4位 1/(2^2) 减到 0 不再减少
val x3:Double=(x2 shr 2).toDouble()
val x4:Double=(x2 shr 5).toDouble()
//无符号右移 >>> ushr
val x5=10 ushr 2
// 且 &&
val f=true and false and true
val h=true && false
//或 ||
val m=true or false or false
val n=true || false || false
//异或 0∧0=0,0∧1=1,1∧1=0
val p=12 xor 3
LogUtil.all("x2=$x2,x3=$x3,x4=$x4,x5=$x5 ,f=$f,h=$h,m=$m,n=$n,p=$p")
}
输出
===========================S==============================
x2=8,x3=2.0,x4=0.0,x5=2 ,f=false,h=false,m=true,n=true,p=15
===========================E==============================
字符
用char表示,不能直接当做数字。’1’, 支持几个转义序列,\t \b \n \r \’ \ \$ ;编码其他要用Unicode转义:’\uFF00’。
布尔
Boolean类型,有两个值 true、false。
内置运算 && 、|| 、!
数组
用Array表示
arrayof(1,2,3) 初始化数组
arrayOfNulls 表示空数组 长度为10
val b = arrayOfNulls<String>(10)
for (x in b) {
println(x)
}
输出
null
null
null
null
null
null
null
null
null
null
还有表示同一类 IntArray 、ByteArray 、等 与 Array 没有继承关系 ,可以表示弄一类型数组 。
字符串
用String表示
val b : String ="HelloWorld"
println("b[2]=${b[2]}")
for (x in b) {
println(x)
}
可以遍历,使用字符访问。
输出
b[2]=l
H
e
l
l
o
W
o
r
l
d
字符串字面值
“”” 有点类似于html pre标签,把字符串预定输出样式
val text = """
for(c in "Hello"){
println(c)
}
"""
println(text)
输出
for(c in "Hello"){
println(c)
}
trimMargin() 函数去除前导空格
字符串模板
在字符串里面调用方法,属性
val b: String = "HelloWorld"
println("b[2]=${b[2]}")
包
申明,源文件通常以包申明开头
package com.qishui.util
默认导入
import kotlin.*
import kotlin.annotation.*
import kotlin.collections.*
import kotlin.comparisons.*
import kotlin.io.*
import kotlin.ranges.*
import kotlin.sequences.*
import kotlin.test.*
import kotlin.*
导入kotlin中所有方法、属性
import com.qishui.util.StringUtils
导入util包中StringUtils类
根据不同平台,还会导入其他额外的包。
如果名字相同的类,可以使用别名
import com.qishui.util.LogUtil
import com.qishui.LogUtil as SecLogUtil
顶层声明可见性
如果顶层声明是private的,声明它的文件是私有的。
控制流
if表达式
使用if就可以返回数据,不需要三元表达式。
fun minOf(a:Int,b:Int)=if(a<b) a else b
如果是表达式,如要使用else 。
when表达式
类似switch方法,直到某一分支符合,结束语句。
for (f in 0..5) {
val x = Random().nextInt(10)
when (x) {
0 -> {
LogUtil.e("x=0")
}
1 -> {
LogUtil.e("x=1")
}
2, 3, 4 -> {
LogUtil.e("x=${x}属于【2,4】")
}
in 5..7 -> {
LogUtil.e("x=${x}属于【5,7】")
}
else -> {
LogUtil.e("x=${x}属于【5,10】")
}
}
}
输出
===========================S==============================
字符串长度10 x=3属于【2,4】
===========================E==============================
===========================S==============================
字符串长度3 x=0
===========================E==============================
===========================S==============================
字符串长度10 x=6属于【5,7】
===========================E==============================
===========================S==============================
字符串长度10 x=2属于【2,4】
===========================E==============================
===========================S==============================
字符串长度10 x=2属于【2,4】
===========================E==============================
===========================S==============================
字符串长度3 x=0
===========================E==============================
可以取代if if-else 。
返回和跳转
类和对象
第三部分: 2018年5月10日16:30:06
类和继承
属性和字段
接口
可见性修饰符
扩展
数据类
密封类
泛型
嵌套类
枚举类
对象
委托
委托属性
函数和Lambda
第四部分: 2018年5月10日16:34:44