您的位置:首页 > 其它

Kotlin学习笔记一基础语法

2018-03-04 16:19 429 查看
一,函数: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 =12a = b.toString()//把数字b转成字符串存进ab = a.toInt() //把字符串a转成数字存进b
关键字step步长,从第一个数开始,每隔3个步长取值for(i in1..5step3)print(i)// 输出 14

倒序输出是downTo//倒序输出5 4 3 2 1 0for( 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修饰的方法,可以用空格代替点来调用方法,是代码可读性提高
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: