A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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"

1 个回复

正序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马