一,函数:
fun 函数名(参数名:参数类型):返回值类型{
函数体
}
1. fun 是函数的声明,固定写法
2.main方法是程序的入口
fun main(args:Array<String>){
println("hello kotlin");
}
3.返回值类型:Unit,代表无返回值,可以省略不写
二,常见数据类型:
Byte,Short,Int,Long,Float,Double,String(怎么没有Boolean和Char)
类型推断(Type inference) : kotlin会通过类型推断自动推断数据类型
var 声明变量 val声明常量
字符串模版
"${name}喜欢吃汤圆"
三,if判断,when表达式,空值处理
kotlin里面,默认参数是不允许传null,参数加上?代表可以接受null。这样就在程序编写时,避免了空指针异常。
四,loop和range是啥?字符串转数字?尾递归优化?
- var width = 0 ..99 (width的取值是[0,99],闭区间,包含0和99)
..
看做是方法名,调用 0 的rangeTo
方法,传入 99 作为参数,会返回一个闭区间对象- var height = 1 until 100 // [1,100) 半开区间,包含1,不包含100
字符串转数字
var a ="12"
var b =12
a = b.toString()//把数字b转成字符串存进a
b = a.toInt() //把字符串a转成数字存进b
关键字step步长,从第一个数开始,每隔3个步长取值
for(i in1..5step3)print(i)// 输出 14
倒序输出是downTo
//倒序输出5 4 3 2 1 0
for( i in 5 downTo 0 ){ println(i) }
//step和downTo混合使用
for( i in 5 downTo 1 step 3)
print(i)//输出52
集合API:reversed反转集合 count集合总数
★java中如果递归次数太多,会造成StackOverflowError,kotlin中利用尾递归优化解决
//累加计算 fun main(args: Array<String>){ var result =0L print(ollAdd(100000))//栈溢出异常 print(ollAdd2(100000,result))//正常输出结果 } fun ollAdd(num :Int):Int{ println("第${num}次运算") return if (num==1) { 1 }else num+ollAdd(num-1) } tailrec fun ollAdd2(num :Long,result:Long):Int{ println("第${num}次运算,运算结果$result") return if (num==0L) { 1 }else ollAdd2(num-1,num+result) }
五,一些思想:面向对象,封装,继承,抽象类和多态,接口和抽象类
- 父类中open修饰的方法,才可以被子类重写
★接口是事物的能力,抽象类是事物的本质。
六,委托和代理 kotlin代理接口by
- 委托是把事情托付给别人或别的机构办理
- 代理是指以他人的名义,在授权范围内进行对被代理人直接发生法律效力的法律行为。代理的产生,可以是受他人委托。
//洗碗的接口
interface IWashBowl{
fun washing()
}
//大头儿子类,具备洗碗方法,一次挣一块钱
class BigHeadSon : IWashBowl{
override fun washing(){
println("我是大头儿子,我在开心的洗碗,1次赚一块钱")
}
}
//小头爸爸也具备洗碗能力,洗一次碗挣10块钱,但是但是小头爸爸让大头儿子去洗,
class SmallHeadFather:IWashBowl by BigHeadSon(){
override fun washing() {
println("我是小头爸爸,我在开心的洗碗,1次赚十块钱")
BigHeadSon().washing()
print("我看着儿子把碗洗完了")
}
}
七,枚举
enum class Week{
星期一,星期二,星期三,星期四,星期五,星期六,星期日
}
fun main(args:Array<String>){
println(Week.星期五)
}
八,印章类, Sealed class 子类类型有限的class
abstract类的子类可以使任意类型,sealed的子类限定了,只能是类中已定义的。
印章类和枚举的区别:
★Sealed class 更在意类型,枚举更在意数据。
九,闭包Closure???
- 让函数成为编程语言中的一等公民
- 让函数具有对象所具有的能力(封装)
- 让函数具有状态
所有:函数、Lambda、if语句、for、when,都可以称之为闭包。通常情况下,我们所说的闭包是 Lambda 表达式
下面if 语句是一个闭包。
fun main(args: Array<String>) { test } val test = if (5 > 3) { print("yes") } else { print("no") }
自执行闭包就是在定义闭包的同时直接执行闭包,一般用于初始化上下文环境。 例如:
{ x: Int, y: Int ->
println("${x + y}")
}(1, 3)
十,编程方式 函数式编程
- OOP面向对象编程
- FP 函数式编程
- AOP 面向切面编程 Aspect Oriented Programming
- PO 面向过程编程 Procedure Oriented
函数式编程的优点:
- 简洁,方便理解
- 方便程序修改和扩展
十一,高阶函数
- 一个用函数作为参数或者返回值的 函数
maxBy函数 获取最大值
minBy函数 获取最小值
filter函数 过滤指定条件 接收参数是一个布尔表达式
map函数 某些属性映射成新的集合
any函数 结果是boolean类型,判断是否满足给定的条件
count函数 统计满足条件的个数
find函数 查找第一个满足条件的数据
groupBy函数 按条件分组
十二,DSL (领域特定语言Domain Specify Language)
- 扩展函数 :List<T>.myFunction(参数:参数类型){} 给list集合扩展一个myFunction方法
- 中缀表达式 infix :infix修饰的方法,可以用空格代替点来调用方法,是代码可读性提高