kotlin需要注意的知识点

字符串模板  "$var"

lambda表达式跳出循环,需要设置标记。否则跳出当前函数
array.forEach forEach@{
   if(it == 'b') return @forEach
}

Lambda表达式:
就是匿名函数
写法:{[参数列表] -> [函数体,最后一行是返回值]}
举例: val sum = { a:Int , b:Int -> a + b }
表示:
()-> Unit   - 无参返回类型为Unit
  (Int) -> Int   - 传入整形,返回一个整形
  (String,(String) -> String) -> Boolean   - 传入字符串,Lambda表达式,返回Boolean
调用:( )
   举例:sum(2,3) 等价于 sum.invoke(2,3)
简化:
   -函数参数调用时,最后一个Lambda可以移出去
   -函数参数只有一个lambda时,调用时小括号可以省略
   - lambda参数只有一个可以默认为it
   - 入参,返回值与形参一致的函数可以用函数引用的方式作为实参传入


类的属性
classA(val a:Int, b:Int){
   var c:Float = 3f
}
属性访问控制:
- val a:Int = 0
-      get() = filed
- var b:Float = 0f
-       set(value){ filed = value }
属性初始化:
- 属性尽量在构造方法中初始化
- var 用 lateinit 延迟初始化,val 用 lazy

可以自定义Delegate委托


中缀表达式:
-只有一个参数,且用infix修饰的函数
-class Book{ infix fun on(place:String){...} }
  Book() on "My Desk"

分支表达式:
普通的if..else.. 是分支语句
val mode = if(args.isNotEmpty() && args[0] == "1"){
     DEBUG
}else{
     USER
}
返回的是分支的最后一句表达式

函数的参数:
具名参数(arg = 1) 
     指定具体的参数进行传参
变长参数 vararg args:String
     如果是数组的话,则可以使用*array传参   *是操作符,用于展开Array,不能重载
默认参数  (arg:String = 1)
     传参时,若有歧义(最后参数使用默认参数则不会产生歧义),需要使用具名参数传参


Collection:
filter 按条件过滤集合
map 按条件转换集合里的每一个元素
all 所有元素符合条件返回true
any 任意元素符合条件返回true
count 返回符合条件的个数
find  返回符合条件的第一个元素
flatMap  扩展集合list元素包含alist,则返回一个所有元素alist集合
max  maxBy min minBy 返回最大最小值
sorted sortedBy 排序,自然排序或者条件排序
sum sumBy sumByDouble 总和 
groupBy 分组,返回map集合
partition 按真假分组,返回Pair<List<T>,List<T>>
fold 循环叠加操作


经过const修饰的常量,才是java中理解的常量
const val A 
val B
在java中引用
FileName.A
FileName.getB()


操作符:run、with、let、also、apply、takeIf、takeUnless、repeat

继承:
父类需要open才可以被继承
父类方法,属性需要open才能被复写
接口,接口方法,抽象类默认为open
复写父类接口成员需要override关键字
kotlin里面interface里面的方法可以实现!!!!

伴生对象相当于静态变量或者静态方法,如果java调用,可以加上@JvmStatic和@JvmFiled

扩展成员:
扩展方法:fun X.y():Z { ... }
扩展属性:val X.m 扩展属性不能初始化,类似于接口

dataclass充当javabean会遇到问题:类是final类型的,没有无参构造方法
可以使用allOpen和noArg插件,运行时反射该类进行,去final建无参构造

data默认实现了copy,toString,equals,hashcode等方法。 componentN方法

内部类,默认的内部类为静态内部类,想转为非静态内部类,需加上inner关键字。 与java不同!!
匿名内部类:object:interface{ override fun method(){ .. } } 可以继承父类,java不能

密封类sealed:是子类可数
枚举类enum:是实例可数

高阶函数:
函数引用:::println 带有Receiver的引用:pdfPrinter::println
reudce 返回叠加结果
joinToString()  拼接字符串
复合函数:m(x) = f(g(x))
//val m() = f() compose g()
infix fun < P1 , P2 , R > Function1< P2 , R >. compose (function:Function1< P1 , P2 >):Function1< P1 , R >{
    return fun (p1: P1 ): R {
        return this .invoke(function.invoke(p1))
    }
}

函数及操作符:

tailrec尾递归优化

科理化currying:多元函数变成一元函数调用链的变换
偏函数:指定多元函数的某些参数而形成新的函数

协程:非抢占式的异步,基于虚拟机的。轻量级的应用,不适应于大并发。

listof(),mapOf(),没有add,remove方法,返回的是kotlin.Collections
mutableListOf() 有add,remove方法,返回的是java.util.ArrayList

kotlin中使用注解处理器
配置插件:apply plugin: 'kotlin-kapt'
sourceSets{
  main.kotlin.srcDirs += "build/generated/source/kapt/main"
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值