本帖最后由 1763982023 于 2017-11-18 16:10 编辑
前言
做个回顾,不然时间长了,会忘记自己早前所学的,毕竟时间是杯忘情水,喝了人生就迷离了,鉴于黑马官网已经出了关于kotlin基础的视频,所以关于前面的内容我就不多赘述了(也遗忘了很多,需要补补了,,关于关键字和扩展函数,需要做点笔迹再归类一遍).
说说kotlin和java的对比吧,性能上kotlin和java都是生成.class的字解码文件,都是JVM,所以编译速度基本一致,但是呢,在有些场合kotlin是要略微快一点(虽然kotlin的函数库多一点,再虽然你在intellj上编译运行速度很慢,但是其实就是差不多的),所以kotlin是为程序员所开发的,因为它能将近节省掉2/3代码量.
kotlin节省代码的方式,在java里面很突出(在android里面更突出).现在就以java来看一下kotlin,其实kotlin具备的代表性的突出优点是 : 杜绝空指针问题(虽然这问题很容易被解决),再者就是它能解决java抢占式线程资源问题.这就是协程(个人理解: 就是协作互赢的线程),最重要的是它是全栈性质的语言(和Python类似).所以借老师最喜欢说的那句:回顾昨天,展望今天.
函数引用
引用包级函数:args(::println)
引用成员方法:filter(String::isEmpty)
Map函数
[AppleScript] 纯文本查看 复制代码 list.forEach{
var a=it*2+2
fun()....
}//过于累赘
[AppleScript] 纯文本查看 复制代码 val ListMap=list.map{
it*2+3
}
简洁的打印方式
[AppleScript] 纯文本查看 复制代码 new ListMap=list.ForEach(::print)
里面存在数组进行换算迭代。如果只是遍历用list.map(::print)是影响其性能的,应该用list.forEach(::print)
flatMap函数
如果list里面元素集合是集合类型,可以用flatMap进行打平,
[AppleScript] 纯文本查看 复制代码 val a=list.flatMap{it}
a.forEach(::print)
如果想改变里面的每个参数可以使用
[AppleScript] 纯文本查看 复制代码 val a=list.flatMap{
it.Map{it*2+3(//"No.$it"也行)}
}
a.forEach(::print)
reduce函数(累积)
[AppleScript] 纯文本查看 复制代码 val a=listOf(1,2,3,6,34,4)
print(a.reduce{acc,i->acc+i}
//print 元素总和
reduce里面的参数,acc是之前的值得运算结果,i表示当前元素。
集合toString/fold
joinToString()是给每个元素后面添加括号内元素,而joinToString{...}
将每个元素像自己计划更改。
[AppleScript] 纯文本查看 复制代码 val a=listOF("ben","min",4,5,4,6)
print(a.joinToString{","})
//print ben,min,4,5,4,6,
val a=listOF("ben","min",4,5,4,6)
print(a.joinToString{"No.$it"})
fold添加首元素及功能延伸(没试验出来)
filder函数(过滤器)
[AppleScript] 纯文本查看 复制代码 val a=listOF(4,5,4,6,48,77,9)
print( a.filter{it%2==0})
print( a.filter{index,i-<index/2==0})
//index是当前位置,i是当前元素
上述代码实现了元素为偶数的过滤,和实现了坐标为偶数的过滤,这函数是取一切符合条件的元素。
takeWhile(截止性过滤)
满足条件下一直遍历,直到遍历到不满足条件的break
val a=listOF(4,5,4,6,48,77,9)
print( a.takeWhile{it%2==0})
//print [4]
let函数
[AppleScript] 纯文本查看 复制代码 fun main(vararg arg:String){
Ben(1,"ad").let{ (a,b)->
print(a)
print(b)
//一般习惯用It.来调用类内部成员
}
}
data class Ben(var a:Int,var b:String){
fun work(){
print("你好,我是黑马的黑")
}
}
说白了就是调用函数内部所有的成员(函数也是噢,毕竟是一级公民呀)
apply函数
[AppleScript] 纯文本查看 复制代码 fun main(vararg arg:String){
Ben(1,"ad").apply{
work()
//完全节省了It的操作了
}
}
data class Ben(var a:Int,var b:String){
fun work(){
print("你好,我是黑马的黑")
}
}
use函数/读取文件
[AppleScript] 纯文本查看 复制代码 //readText();
//readLines();
BufferedReader(FileReader("a.txt").readText()
函数的复合
[AppleScript] 纯文本查看 复制代码 fun main(vararg args:String){
var mu2={it:Int->it*2}
var add1={it:Int->it+5}
var fx=num2 andThen add1
print(fx(5))
}
infix fun<P1,P2,R> Function1<P1,P2>.andThen(function:Function<P2,R>):Function<P1,R>{
return fun(p1:P1):R{
return function.invork(this.invoke(p1))
}
}
利用闭包实现函数式编程的实现
Currying(科里化)
一种链式编程模式
[AppleScript] 纯文本查看 复制代码 fun main(vararg args:String){
ben("min","aa")
ben("ben")("aa")
}
fun ben(a:String,b:String)
print(a+b)
}
//由上式currying演变而来
fun ben(a:String)
=fun(b:String)
=print(a+b)
科里化的原理
fun main(vararg args:String){
::lan.curred()("ben")("ben")
}
fun<P1,P2,R> Function2(P1,P2,R).curred()
=fun(p1:P1)=fun(p2:P2)=this(p1,p2)
fun lan(a:String,b:string){print a+b}
除上述语言还有groupBy函数,偏函数,(扩展函数单独放一块吧)等
协程的理解
解释
Coroutine 被翻译成了“协程”,意思就是要各个子任务程协作运行的意思,所以大家一下就明白了它被创造出来是要解决异步问题的。协程的调度是非抢占式的,目前常见的各支持协程的语言实现中都有 yield 关键字,它有“妥协、退让”的意思,如果一个协程执行到一段代码需要歇会儿,那么它将把执行权让出来,如果它不这么做,没人跟它抢.以下是样板
fun <T> async(block: suspend () -> T)
async {doSomething(foo){
……
}
总结,
写了一堆堆(总结于bennyXXX:名字忘了,呵呵),又没详细解释,时间也挺紧凑,难得自习一天,分享总结一下自己之前学习,希望大家多多指点与批评,并希望和大家分享自己的那些坑坑洼洼的学习之路,本人能力有限,只能表达成这样了,属性也是lazy{...},有些连结果都没复制了,最后还是盗用网上那句话"人生苦短,快用kotlin" |
|