Kotlin学习-函数(表达式,lambda,高阶函数)

本文深入讲解Kotlin中的函数表达形式,包括一般函数、简化表达式形式、带默认参数的函数及lambda表达式。同时,探讨了高阶函数如apply、run、also、let和with的应用,函数作为参数的使用方式,以及函数引用的概念。

Kotlin中函数 3种表达形式:

 

1,一般函数:

fun sum(a: Int, b: Int): Int {
    return a+b
}

 

2,简化函数为表达式形式:

fun sum2(a: Int, b: Int): Int = a + b
fun max(a: Int, b: Int): Int = if(a > b) a else b
fun isOdd(x: Int) = x % 2 != 0

 调用:sum2(3,2),max(8,9)

 

带默认参数的函数

//函数参数可以指定默认参数
fun multiply(a:Int,mut:Int=2):Int{
    var result = 1 
    for(i in 0..mut){
        result *= a
    }
    return result
}

 

3,lambda表达式函数定义:

1. 无参数情况 :
val/var 变量名 = { 操作的代码 }
2. 有参数情况
val/var 变量名 : (参数的类型,参数类型,...) -> 返回值类型 = {参数1,参数2,... -> 操作参数的代码 }
示例:val sumLambda: (Int, Int) -> Int = {x,y -> x+y}
3,自动推导返回值类型(即表达式的返回值类型会根据操作的代码自推导出来)
val/var 变量名 = { 参数1 : 类型,参数2 : 类型, ... -> 操作参数的代码 }
示例:val sumLambda2 = {a : Int , b : Int -> a + b}

 例如:

val sumLambda1: (Int, Int) -> Int = {x,y -> x+y}
val sumLambda2 = {a : Int , b : Int -> a + b}

 

 

高阶函数:apply/run/also/let/with

kotlin标准库提供了Any对象上下文内执行一段代码块,可用于对象初始化,直接使用对象内部方法,使代码更精简化。

 

run即可作用于Any,又可作为this代码块,run返回执行的是处理结果

示例:

fun initContentTextView(tvContent:TextView?){
        tvContent?.run {//对象初始化处理
            this.text = "kotlin"
            this.textSize = 13f
            this.setCompoundDrawables(null,null,getDrawable(R.drawable.abc_ab_share_pack_mtrl_alpha),null)
        }
    }

fun getIdentify(index:Int):String{
        val person_play = run {//将最后处理结果返回str
            when(index){
                0 -> "manager"
                1 -> "guest"
                2 -> "worker"
                else -> "none"
            }
        }
        return person_play
    }

fun getSampleNickName(nn:String):String{
        var sampleName = nn.run {
            if(this.length>10)
              substring(0,this.length-6)
            else
                nn
        }
        return sampleName
    }

 apply用法类似run,区别在于apply执行完成block()函数后,返回自身对象
 返回自身对象,可以使用链式方法使用.apply{}.apply{}

val adam = Person("Adam").apply { 
    age = 20
    city = "London"
}

 

 

let内部使用it指代当前对象,返回最后一行处理结果, (T) -> R

fun testLet(st:String?){
        st?.let {  // execute this block if not nul
            it.plus("-let1")
            if(it.startsWith("android"))
                it.drop(8)
        }
    }

val listWithNulls: List<String?> = listOf("element1","element2", null)
    for (item in listWithNulls) {
        item?.let { // 元素不为空时执行
            println(it)
        }    
     } 

 

与let函数相似,区别是also执行完成后返回对象本身,let返回处理结果

fun testAlso() {
        val numberList = mutableListOf<Double>()
        numberList.also {
            println( "init the list")
        }.also {
            it.add( 2.71)
            it.add(3.14)
            it.add(1.0)
        }.also {
           println(  "Sorting the list")
        }.sort()
    }

 

with函数作用于一个对象,返回最后一行处理结果

 fun testWith(){
        var p = Person("Tom",26)
        //写法一,对象receiver和一个lambda函数块
        val result = with(p, {
            println("my name is $name, I am $age years old")
            1000
        })
        //由于with函数最后一个参数是一个函数,可以把函数提到圆括号的外部修改后
        val result2 = with(p) {
            println("my name is $name, I am $age years old")
            1000
        }

        val numbers = mutableListOf("one" , "two","three")
        with(numbers) {
            val firstItem = first()
            val lastItem = last()
            println("First item: $firstItem, last item:$lastItem")
        }
    }

 

函数作为参数

在kotlin中函数可以作为参数传递给另一个函数去执行

例如:

 var globalLock = ReentrantLock()
    inline fun <T> lockInnerHandle(body: () -> T): T {//统一实现函数线程安全锁
        globalLock.lock()
        try {
            return body()
        }
        finally {
            globalLock.unlock()
        }
    }

 通过这种方式可以统一实现某些功能的形式,简化函数重复代码量,高阶函数 run/apply/let/also等也是将函数作为参数处理的

 

函数引用

    fun isOdd(x: Int) = x % 2 != 0
    fun isOdd(s:String) = s =="kotlin"|| s =="java"|| s == "cpp"
    fun calLength(s:String ) = s.length

    val numbers = listOf(1,2,3)
        //normal invoke
        println(numbers.filter { isOdd(it) })
        //Function References ::调用
        println(numbers.filter(::isOdd))


//组合函数使用
    fun composeFun(){
        val oddLength = compose(::isOdd, ::calLength)//compose(f, g) = f(g(*))
        val strings = listOf("a","ab" , "abc" )
        println(strings.filter(oddLength))
    }
    //组合函数定义
    fun <A, B, C> compose(f: (B)-> C, g: (A) -> B): (A) -> C {
        return { x -> f(g(x)) }
    }

//显示指定参数的方法,调用
        val predicate: (String) -> Boolean = ::isOdd
        predicate("cpp")

//调用类成员
 class A(val p:Int)

//调用类的成员方法或扩展方法
  val prop = A::p

 

转载于:https://www.cnblogs.com/happyxiaoyu02/p/10689785.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值