4:kotlin 方法(Functions)

想要声明一个函数需要使用fun关键字

kotlin 复制代码
fun hello() {
    return println("Hello, world!")
}

fun main() {
    hello()
    // Hello, world!
}

格式:

kotlin 复制代码
fun 方法名(参数1: 参数1类型, 参数2 : 参数2类型, ...): 返回值类型 {
    方法体
    return 返回值
}

fun 方法名(参数1: 参数1类型, 参数2 : 参数2类型, ...){
    方法体
}

参数可以有一个或者多个,也可以没有参数。

举例

kotlin 复制代码
fun sum(x: Int, y: Int): Int {
    return x + y
}

fun main() {
    println(sum(1, 2))
    // 3
}
kotlin 复制代码
fun printMessageWithPrefix(message: String, prefix: String) {
    println("[$prefix] $message")
}

fun main() {
    printMessageWithPrefix(prefix = "Log", message = "Hello")
    // [Log] Hello
}

建议使用小驼峰命名法

默认参数值

kotlin 复制代码
fun printMessageWithPrefix(message: String, prefix: String = "Info") {
    println("[$prefix] $message")
}

fun main() {
    printMessageWithPrefix("Hello", "Log") 
    // [Log] Hello
    
    printMessageWithPrefix("Hello")        
    // [Info] Hello
    
    printMessageWithPrefix(prefix = "Log", message = "Hello")
    // [Log] Hello
}

如果跳过某一个参数,若果有后续的参数,必须指定参数名字

单一表达式方法

kotlin 复制代码
fun sum(x: Int, y: Int): Int {
    return x + y
}
fun main() {
    println(sum(1, 2))
    // 3
}

对单表达式函数,可以进行一下简化

  • 去除返回值类型
  • 去除return关键字
  • 去除{}
  • =连接方法体
kotlin 复制代码
fun sum(x: Int, y: Int) = x + y

fun main() {
    println(sum(1, 2))
    // 3
}

Lambda 表达式

如下方法

kotlin 复制代码
fun uppercaseString(str: String): String {
    return str.uppercase()
}
fun main() {
    println(uppercaseString("hello"))
    // HELLO
}

可写为

kotlin 复制代码
fun main() {
    println({ str: String -> str.uppercase() }("hello"))
    // HELLO
}
  • 方法定义在{}
  • 参数后边跟着->
  • ->后边跟着方法体
  • str是参数名字
  • String是参数类型
  • 返回值为.uppercase()方法的返回值类型

固定格式,没什么可研究的

如果是无参数的Lambda方法

kotlin 复制代码
fun main() {
    { println("hello") }()  // hello
}

Lambda表达式可以以多种方式使用

  • 将lambda分配给稍后可以调用的变量
  • 将lambda表达式作为参数传递给另一个函数
  • 从函数返回lambda表达式
  • 单独调用lambda表达式

赋值给变量

kotlin 复制代码
fun main() {
    val upperCaseString = { string: String -> string.uppercase() }
    println(upperCaseString("hello"))
    // HELLO
}

函数类型

对于使用变量接收一个Lambda函数时,可能需要对函数进行类型定义

  • 参数类型写在()内,多个类型用,分割
  • 返回值类型跟在->后边
kotlin 复制代码
val upperCaseString1: (String) -> String = { string -> string.uppercase() }
// 					     ↑          ↑
//                    参数类型   返回值类型		
val upperCaseString2 : () -> String = { "hello" }

		
fun main() {
    println(upperCaseString("hello"))
    // HELLO
}

作为参数使用

kotlin 复制代码
fun main() {
    val numbers = listOf(1, -2, 3, -4, 5, -6)
    val positives = numbers.filter { x -> x > 0 }
    val negatives = numbers.filter { x -> x < 0 }
    println(positives) // [1, 3, 5]
    println(negatives) // [-2, -4, -6]
}

.fileter()方法接收一个Lambda方法作为参数

  • { x -> x > 0 } 获取List中>0的元素
  • { x -> x < 0 } 获取List中<0的元素

作为返回值在方法中返回

kotlin 复制代码
fun main() {
    fun toSeconds(time: String): (Int) -> Int = when (time) {
//                      ↑          ↑       ↑
//          toSeconds的参数及类型   ↑  要返回的lambda函数的返回值类型   
//                        要返回的lambda函数的参数类型        
        "hour" -> { value -> value * 60 * 60 }
        "minute" -> { value -> value * 60 }
        "second" -> { value -> value }
        else -> { value -> value }
    }

    fun main() {
        val timesInMinutes = listOf(2, 10, 15, 1)
        val min2sec = toSeconds("minute")
        val totalTimeInSeconds = timesInMinutes.map(min2sec).sum()
        println("Total time is $totalTimeInSeconds secs")  // Total time is 1680 secs
    }
}

Trailing lambdas (后置Lambda)

.fold()方法接收一个Int和一个lambda函数,调用方法时可写做

kotlin 复制代码
println(listOf(1, 2, 3).fold(0, { x, item -> x + item })) // 6

使用后置lambda方式时可写做

kotlin 复制代码
println(listOf(1, 2, 3).fold(0) { x, item -> x + item })  // 6

lambda函数放在()

相关推荐
hai_android15 小时前
不用 AIDL,手把手教你手写 Binder 代理类
android·kotlin
雨白18 小时前
Kotlin 泛型进阶:攻克型变与实化,直击痛点
kotlin
alexhilton1 天前
架构测试为何需要双视图
android·kotlin·android jetpack
事圆则缓1 天前
Jetpack Compose 快速上手
android·kotlin
事圆则缓1 天前
MVC、MVP、MVVM、MVI 的区别与实现原理
android·kotlin·mvc
事圆则缓1 天前
Android组件化指南
android·kotlin
事圆则缓1 天前
Jetpack Compose Effect 完全指南
android·kotlin
我命由我123452 天前
Android Jetpack Compose 开发问题:Unresolved reference ‘Icons‘.
android·java-ee·kotlin·android studio·android jetpack·android-studio·android runtime
坚果的博客2 天前
CPF-KMP-CMP:在鸿蒙上用 Kotlin 写跨平台应用
华为·kotlin·harmonyos
事圆则缓2 天前
Kotlin 高阶工程化与 Android 深入实践
android·开发语言·kotlin