kotlin学习(4)-高阶函数

(1)基本概念:

高阶函数:传入或者返回函数的函数,函数引用 : ::println()

package 高阶函数

fun main(args: Array<String>) {

    //::函数引用第一种,直接加方法名
    args.forEach(::print)

    //类名::方法名
    args.filter (String::isNotEmpty)


    //实例名::方法名
    val hello=Hello()
    args.forEach (hello::world)

}
class Hello{
    fun world(any: Any){
        kotlin.io.println(any)
    }
}

(2)常见高阶函数

1.map 一个集合改变元素后成为另一个集合

 val form = listOf(1,2,3,4,5)

 val newForm =  form.map { it+10 }

2.reduce 求和,阶乘

    val  mulList = listOf(1,2,3,4)
    val mul = mulList.reduce { acc, i -> acc * i }

    print(mul)

3.apply任意调用该对象的任何方法,并返回该对象

//apply任意调用该对象的任何方法,并返回该对象
    val task=Runnable{ println("运行中")}
    Thread(task).apply { isDaemon = true }.start()

    val ss="dadas".toUpperCase()
    println(ss.apply { isNotEmpty()})

4.let默认当前这个对象作为闭包的it参数,返回值是函数里的最后一行或者指定return

//let默认当前这个对象作为闭包的it参数,返回值是函数里的最后一行或者指定return
    println("dsadas".let {
        println(it)
        999
    })

5.with可以调用当前对象所有方法

  println(with("dadsad"){
        toUpperCase()
    }.let {it.toLowerCase()})

6.run和apply很像,不过run是将最后一行返回

  ArrayList<String>().run {
        add("123")
        add("223")
        add("323")
        println(this.joinToString())

    }

7.use 可以安全的关闭任何一个可closeable对象

 //use 可以安全的关闭任何一个可closeable对象
    var input=Files.newInputStream(Paths.get("input.txt"))
    var byte=input.use ({ input.read() })

(3)尾递归优化

递归的一种特殊形式,调用自身后无其他操作,tailrec关键字提示编译器尾递归优化

package 高阶函数

class ListNode(var value:Int,var next:ListNode?=null)

tailrec fun findNode(head:ListNode?,value:Int):ListNode?{
    head?:return null
    if (value==head.value) return head
    return findNode(head.next,value)
}

fun main(args: Array<String>) {
    val MAX_NUM=100000
    var head=ListNode(0)
    var p=head
    for (i in 1..MAX_NUM){
        p.next= ListNode(i)
        p= p.next!!
    }

    println(findNode(head,MAX_NUM-2)!!.value)
}

(4)闭包:函数运行的环境,持有函数运行状态,函数内部可以定义函数或者类

package 高阶函数

val string="HelloWorld"

fun makefun():()->Unit{
    var count=0
    return fun(){
        println(++count)
    }
}

fun fibonacci():()->Long{
    var first=0L
    var second=1L
    return fun():Long{
        val result=second
        second+=first
        first=second-first
        return result
    }
}

fun fibonacciw():Iterable<Long>{
    var first=0L
    var second=1L
    return Iterable{
        object : LongIterator() {
            override fun hasNext()=true

            override fun nextLong(): Long {
                val result=second
                second+=first
                first=second-first
                return result
            }
        }
    }
}

fun main(args: Array<String>) {
//    fibonacciw().takeWhile { it <= 100 }.forEach { println(it) }


    val add5= add(5)
    println(add5(2))
}


fun add(x:Int)=fun (y:Int)=x+y

(5)demo 统计字符串个数

package 高阶函数

import java.io.File

fun main(args: Array<String>) {

    val  map=HashMap<Char,Int>()
    val text=File("KtTest.iml").readText().toCharArray().filterNot(Char::isWhitespace).forEach{
        val count=map[it]
        if (count==null) map[it]=1
        else map[it]=count+1
    }

    map.forEach(::println)
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值