美文网首页
Kotlin系列之三-函数和Lambda表达式

Kotlin系列之三-函数和Lambda表达式

作者: RookieRun | 来源:发表于2020-03-19 16:12 被阅读0次

一.函数

1.函数的声明,关键字是fun
    fun getSum(a: Int, b: Int): Int {
        return (a + b)
}
fun test(): Unit {
    
}
解释:函数名称,参数类型,返回值类型(没有返回值则省略或者用Unit代替)
2.函数的调用和Java一样,方法名或者通过对象调用
3.参数:
    1.形式,name:type,多个参数用,隔开
    2.默认参数:参数可以用默认值,默认值通过类型后面的 = 及给出的值来定义。当省略相应的参数时,该参数使用默认值:
    class User {
        fun getSum(a: Int, b: Int=5): Int {
            return (a + b)
        }
    }
    //使用
    var user = User()
    var sum = user.getSum(5)
    println("带有默认参数的计算结果为:$sum")//带有默认参数的计算结果为:10
    sum = user.getSum(5,10)
    println("正常的的计算结果为:$sum")//正常的的计算结果为:15
    3.覆盖函数:
        1.如果覆盖一个带有默认参数的函数时,必须从函数签名中省略默认的参数值:
            open class A {
                open fun foo(i: Int = 10) { /*......*/ }
            }
            class B : A() {
                override fun foo(i: Int) { /*......*/ } // 不能有默认值
            } 
    4.具名参数:可以在调用函数时使用具名的函数参数。
    5.单表达式函数:
        当函数返回单个表达式时,可以省略花括号并且在=符号之后指定代码体即可,当然,返回值也是可选的
        fun doubldTheNumber(number: Int): Int = number * 2
    6.可变数量的参数:
        1.函数的参数(通常是最后一个)可以用vararg修饰符标记
4.函数的作用域
    1.在Kotlin中,函数可以在文件的顶层声明(而Java中,函数必须作为类的一部分),此外,除了顶层函数,Kotlin中函数也可以声明在局部作用域,作为成员函数以及扩展函数
    2.局部函数:一个函数在另一个函数的内部(java中没有)
        class User {
            fun test() {
                var a = 1
                fun innerTest() {
                    println("inner print a:$a")
                }
            innerTest()
            println("out print a:$a")
        }
        //inner print a:1
        //out print a:1
        成员函数可以访问外部函数的局部变量
    3.成员函数:类或对象内部定义的函数
    4.泛型函数
        class User {
            fun <T> singleTonList(item: T): List<T> {
                return listOf(item)
            }
        }
5.尾递归        
6.高阶函数
    1.Kotlin的函数都是头等的,这意味着,它们可以存储于变量与数据结构中,作为参数传递给其他高阶函数以及从其他高阶函数返回
    2.高阶函数:将函数作为参数或者将函数作为返回值的参数
7.Lambda表达式
    1.Lambda表达式的完整语法:
        var sum: (Int, Int) -> Int = { x: Int, y: Int ->x + y}
    解释:Lambda表达式总是扩在花括号内,完整语法形式的参数放在花括号内,并有可选的类型标注,函数体跟在一个->符号之后,如果Lambda表达式
    推断出返回类型不是Unit,那么该Lambda主体中的最后一个(或可能是单个)表达式会视为返回值,
    如果把所有的可选标注都留下,则看起来如下:
      var total = { x, y -> x + y }//这个式子报错,没明白啥意思
    2.传递末尾的Lambda表达式
        在Kotlin中有个约定:如果函数的最后一个参数是函数,那么作为相应参数传入的Lambda表达式,可以放在圆括号外
            var items = listOf<Int>()
            val product = items.fold(1) { acc, e -> acc * e }
        同样一脸懵逼...
    3.it:单个参数的隐式名称
        如果编译器可以自己识别出签名,也可以不用声明唯一的参数并忽略->.该参数会隐式声明为it
    4.从Lambda表达式中返回一个值
        我们可以使用限定的返回语法从 lambda 显式返回一个值。否则,将隐式返回最后一个表达式的值。
        因此,以下两个片段是等价的:(懵逼...)
        ints.filter {
            val shouldFilter = it > 0 shouldFilter
        }
        ints.filter {
            val shouldFilter = it > 0 return@filter shouldFilter
        }
        这一约定连同在圆括号外传递 lambda 表达式一起支持 LINQ-⻛格 的代码:
        strings.filter { it.length == 5 }.sortedBy { it }.map { it.toUpperCase() }
8.匿名函数
9.闭包
10.带有接收者的函数字面值
11.内联函数
    1.禁用内联
    2.非局部返回
12.具体化的类型参数

相关文章

网友评论

      本文标题:Kotlin系列之三-函数和Lambda表达式

      本文链接:https://www.haomeiwen.com/subject/rpylyhtx.html