函数 3个月前

编程语言
739
函数

函数

val FINAL_HELLO_CHINA = "HelloChina"

fun main(args: Array<String>) { // (Array<String>) -> Unit
//    checkArgs(args)
//    val arg1 = args[0].toInt()
//    val arg2 = args[1].toInt()
//    println("$arg1 + $arg2 = ${sum(arg1, arg2)}")
//    println(int2Long(3))
//    println(sum(1, 3))
//    println(sum.invoke(1, 3))

//    args.forEach ForEach@{
//        if(it == "q") return@ForEach
//        println(it)
//    }
//
//    println("The End")

    println(sum)
    println(int2Long)
    println(::printUsage is ()-> Unit)
}

fun checkArgs(args: Array<String>) {
    if (args.size != 2) {
        printUsage()
        System.exit(-1)
    }
}

fun printUsage() {
    println("请传入两个整型参数,例如 1 2") // (Any?) -> Unit
} // ()->Unit

val sum = { arg1: Int, arg2: Int ->
    println("$arg1 + $arg2 = ${arg1 + arg2}")
    arg1 + arg2
}
// (Int, Int) -> Int

val printlnHello = {
    println("Hello")
}
// ()-> Unit

val int2Long = fun(x: Int): Long {
    return x.toLong()
}

//Int Long String  ABC

// (Int) -> Long
  • 匿名函数
  • 具名函数::fun_name
  • 命名参数
  • 包级函数
  • Lambda表达式:{[参数列表] -> [函数体,最后一行是返回值]}
  • 如果函数参数的最后一个参数是Lambda表达式,可以把它移到()的外边,例如(){};如果()中什么也没有,可以把()删掉;如果传入的函数跟Lambda表达式是一样的,可使用::fun_name(函数引用)简化;跳出表达式,
  • return标签 ForEach@
  • 函数类型
  • () invoke()
  • 遍历数组 for(i in arr) args.forEach()
  • 扩展方法,有一个默认参数为调用该方法的实例
  • 具名参数
  • 默认参数
  • 单表达式可以省略花括号,在=号后指定代码体即可
  • 函数作用域:顶层函数、局部函数
  • 内联函数
  • Unit ==> void
args.forEach({it -> print(it)})
args.forEach({print(it)})
args.forEach(){print(it)}
args.forEach{print(it)}
args.forEach(::print)

闭包

闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)。

  • 函数是什么

地球人都知道:函数只是一段可执行代码,编译后就“固化”了,每个函数在内存中只有一份实例,得到函数的入口点便可以执行函数了。在函数式编程语言中,函数是一等公民(First class value:第一类对象,我们不需要像命令式语言中那样借助函数指针,委托操作函数),函数可以作为另一个函数的参数或返回值,可以赋给一个变量。函数可以嵌套定义,即在一个函数内部可以定义另一个函数,有了嵌套函数这种结构,便会产生闭包问题。

单表达式函数

fun double(x: Int): Int = x * 2
fun double(x: Int) = x * 2

匿名函数

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

fun(x: Int, y: Int): Int {
    return x + y
}

ints.filter(fun(item) = item > 0)

函数类型

FunctionN,N表示函数参数个数,0~22

Function0
Function1
Function2<in P1, in P2, out R>:Function<R>
...
Function22

中缀表达式 infix

可变参数

可变参数 vararg,可以使用*操作符将可变参数以命名形式传入

fun main(vararg args: String) {
//    for (arg in args){
//        println(arg)
//    }

    val list = arrayListOf(1,3,4,5)
    val array = intArrayOf(1,3,4,5)
    hello(3.0, *array) // 伸展(spread)操作符*,只能展开数组
}

fun hello(double: Double, vararg ints: Int, string: String = "Hello"){
    println(double)
    ints.forEach(::println)
    println(string)
}

高阶函数

高阶函数是将函数用作参数或返回值的函数。

image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2222619
累计阅读

热门教程文档

爬虫
6小节
Linux
51小节
C#
57小节
Kotlin
68小节
React Native
40小节