Kotlin学习笔记一基础语法

一,函数:

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修饰的方法,可以用空格代替点来调用方法,是代码可读性提高
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章