【Kotlin 二】函数/高阶函数/内联函数 对象/主构造函数/次要构造函数/对象初始化

1.函数

函数声明如下:

fun 函数名称([函数参数...]): 返回值类型{
  // 方法体
}

fun sum(num1: Int, num2: Int): Int {
    return num1 + num2
}

注意:Kotlin函数返回值为空时为Unit,并非常见的void

函数可以设置默认值:

fun printNum(numA: Int = 10, numB: Int = 20): Int{
  println(numA + numB)
}

函数入参默认为val(常量),不支持在方法体中修改

1.1 常用的库函数

println:输出一行

readln:接收一行

pow:取次方

1.2 高阶函数

一个函数如果入参类型 or 返回值类型是函数,那么这个函数就是一个高阶函数

一个变量可以有各种各样的类型(Int/String/…),函数当然也会有自己的类型

对于下面的函数,(String) -> Int就是该函数的类型。函数类型其实就是将函数的入参和返回值抽象出来。

fun test(str: (String)): Int {
    return str.toInt()
}

1.2.1 变量接收函数(声明)

Kotlin支持将函数赋给一个变量,与Java不同的是格式上有所区别

// func1为一个能够表示函数的变量,该函数接收一个Int作为入参,没有返回值
var func1: (Int) -> Unit

既然Kotlin已经能够使用变量接收函数了,那么必然就能使用函数A作为函数B的形参

// test作为一个函数,能够接受另一个函数的返回值作为入参
// 形参函数的入参事String,返回值是一个Int
fun test(num1: (String) -> Int) {
    
}

1.2.2 变量接收函数(赋值)

对于已有函数,可以使用::获取函数引用

fun main() {
    var func: (String) -> Int = ::test
    println(func("1"))
}

fun test(str: (String)): Int {
    return str.toInt()
}

也可以直接写匿名函数:

fun main() {
    var func: (String) -> Int = fun(str: String): Int {
        return str.toInt()
    } 
}

匿名函数还有一种更简洁的写法(项目中绝大多数采用这种Lambda表达式来调用高阶函数):

fun main() {
    var func: (String, String) -> Unit = { str1: String, str2: String ->
        println(str1 + str2)
    }

    func("a", "1")
}
// 输出
a1

因为Kotlin有匿名推断机制,所以lambda入参类型可以去掉

fun main() {
    var func: (String, String) -> Unit = { str1, str2 ->
        println(str1 + str2)
    }

    func("a", "1")
}

在lambda表达式只有一个入参的情况时,无需显式写明入参,在函数体内可以直接使用it来代替入参

val func1: (Int) -> Unit = {println(it)}

1.4 内联函数

类似于C++,Kotlin使用inline声明一个内联函数。内联函数在编译时会被编译器直接替换到调用该方法的地方

fun main() {
    test()
}

inline fun test() {
    println("111")
}

// 内联函数替换后
fun main() {
    println("111")
}

2.对象

2.1 主构造函数

一个类可以有多个构造函数,直接写在类名后的是主构造函数。这种形式可以写上默认值,也可以不写

class Student constructor(var name: String, var age: Int) {

}

也可以将类属性放在类体中,类似于Java,但是这种形式要求必须写上默认值

class Student () {
    var name: String = ""
    var age: Int = 0
}

还有一种形式是以上两种形式结合起来,下面这种方法能够自定义getter和setter

class Student (name: String, age: Int) {
    var name: String = name
        get() = field
        set(value) {
            field = value + "1"
        }
    var age: Int = age
        get() = field
        set(value) {
            field = value * 10
        }
}

和Java一样,如果没有规定主构造函数,那么Kotlin会为当前类生成一个无参的默认构造函数;如果规定了主构造函数,那么就不会再有默认的无参构造函数

2.2 次要构造函数

次要构造函数还是需要使用this()来调用主构造函数。次要构造函数可以有自己的函数体

class Student (var name: String, var age: Int) {

    constructor(name: String): this(name, 0) {
        // 次要构造函数体
    }
}

2.3 对象的初始化

因为主构造函数没有函数体,想在对象初始化阶段进行操作时,可以使用init块

class Student (var name: String, var age: Int) {
    init {
        println(name + "出生了")
    }
}

2.4 初始化顺序

当执行一个对象的构造函数时,对应的初始化顺序如下:

  1. init代码块
  2. 主构造函数(如果没有会执行默认的无参构造函数)
  3. 次要构造函数

2.5 空值和空类型

Kotlin默认所有的类型都是非空类型,即编译阶段就可以避免出现变量被赋值为null的情况出现

如果真的需要将某个变量在初始化情况下使用null而不是某个具体的对象,需要在类型名称后加一个?将该变量声明为可空类型

fun main() {
    val student: String? = null
}

Kotlin提供了一种安全的空类型操作:如果想要安全地访问可能包含null值的对象的属性,可以使用安全调用运算符?.

如果对象属性为null则返回null

如果想在可空变量实际为null时返回一个指定的结果,可以使用?:

fun main() {
    var student: Student? = null
    var studentName: String = student?.name ?: "name"
    println(studentName)
}

2.6 访问控制权限

Kotlin有4种访问控制权限:public/internal/protected/private

其中internal是Java所没有的。如果使用了internal修饰符,他将在当前的项目中可以随意访问,权限等同于public,但是如果别人引用我们的项目,别人无法使用被修饰的东西

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
常用的Kotlin拓展函数有以下几种: 1. 使用context的扩展函数:可以直接在context对象上调用dp2px函数,将dp值转换为px值。例如:val pxValue = context.dp2px(10) \[1\] 2. 使用Float的扩展函数:可以直接在Float对象上调用dp2px函数,将dp值转换为px值。例如:val pxValue = 10F.dp2px(context) \[1\] 3. 使用lambda表达式的高阶函数:可以使用lambda表达式更简洁地使用Kotlin高阶函数。例如,可以直接传入匿名函数或使用Lambda表达式进行简化。\[3\] 4. 根据已有函数构造函数类型变量:可以使用函数引用(::)将已有函数转化为函数类型变量,然后传递给其他函数使用。例如,可以将printInt函数转化为(Int) -> Unit类型的函数参数。\[3\] 这些拓展函数的使用可以提高代码的可读性、简洁性和灵活性,同时避免函数名冲突。\[2\] #### 引用[.reference_title] - *1* *2* [kotlin扩展函数](https://blog.csdn.net/flytosky21/article/details/129978317)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Kotlin高阶函数内联函数、内联拓展函数](https://blog.csdn.net/weixin_56769444/article/details/121346864)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值