IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin入门第二节 -> 正文阅读

[移动开发]Kotlin入门第二节

Unit函数的特点

  • 类比java中的void 但是java是关键帧,不是类型,很矛盾
  • Unit不写,默认也有,Unit代表 无参数返回的忽略类型
package com.fyx.s1


fun main() {
}


fun convert() {

}
//等价与上面的写法
fun convert1() : Unit{

}

反引号的作用

  • 可以采用汉字或者数字命名函数或者命名一些关键词的函数
package com.fyx.s1


fun main() {
    `这是一个中文的函数名称`()
}

//函数命名
fun `这是一个中文的函数名称`() {
    
}

//is 在kotlin中是关键词不能明明函数但是可以是用反引号代替
fun `is`() {
    println("ceshi")
}

lambda表达式

  • count后面的{} 就是lambda表达式过滤掉不符合条件的值
package com.fyx.s1

fun main() {
  //{} 会遍历每个字符筛选复合参数的值
    var datas = "Jeecg".count {
        it == 'e'
    }
    println(datas)
}

函数变量声明和隐式返回

package com.fyx.s1


fun main() {
    //变量式声明函数
    var testFuncation: () -> String

    //函数实现
    testFuncation = {
        var count = 100
        //隐式返回 意思就是不用写return 默认最后一行返回
        count.toString()
    }
    println(testFuncation())
}

函数变量入参声明

package com.fyx.s1


fun main() {
    var testfunc: (Int, Int, Int) -> String = { num1, num2, num3 ->
        var prifix = "数字集合$num1 +数字 $num2 + 数字 $num3";
        prifix
    }
    println(testfunc(1,2,3))
}

it 的作用和invoke

  • it作用于函数只有一个参数时可以使用it使用
  • invoke等价与直接使用函数fun1(1,2,3)
package com.fyx.s1


fun main() {
    var fun1: (Int, Int, Int) -> String = { n1, n2, n3 ->
        var name = "1234"
        "这是数字$n1 $n2 $n3 "
    }
    println(fun1.invoke(1, 2, 3))

    var fun2: (String) -> String = {
        "这是数字$it "
    }
    println(fun2.invoke("12"))
}

匿名函数的类型推断

  • 方法名 :必须指定返回类型
  • 方法名 = 可以根据最后一行得到数据类型自动推断
package com.fyx.s1


fun main() {
    var fun1 = {
        var name = "1234"
        "这是字符串"
    }
}

匿名函数lambda表达式和返回类型Any

package com.fyx.s1


fun main() {
    //=匿名函数lambda写法
    var fun1 = { age1: Int, age2: Int ->
        "$age1 $age2"
    }
    println(fun1(12, 12))
    //Any 类型 因为不确定最后一行返回的是数字还是字符串
    var fun2 = { age: Int ->
        when (age) {
            in 10..20 -> "如花"
            else -> -1
        }
    }
    println(fun2.invoke(21))
}

尾随闭包

  • 如果函数的最后一个参数是函数类型,如果打算传入一个lambda表达式作为参数,允许在圆括号之外指定Lambda表达式
package com.fyx.s1


fun main() {
    //定义函数
    var loginResult = { mes: String, code: Int ->
        println("登录的结果$mes 状态码$code")
    }
    login("root", "1234", loginResult)

}

const val USER_NAME = "root"
const val PASS_WORD = "1234"

//定义一个登录方法
fun login(username: String, Passowrd: String, loginResult: (mes: String, code: Int) -> Unit) {
    if (username == USER_NAME && Passowrd == PASS_WORD) {
        loginResult("登录成功", 200)
    } else {
        loginResult("登录失败", -200)

    }
}

内联

  • 如果函数参数有lambda ,尽量使用内联(inline)关键帧,这样内部会做优化,减少函数开辟和对象开辟的损耗
package com.fyx.s1


fun main() {
    //定义函数
    var loginResult = { mes: String, code: Int ->
        println("登录的结果$mes 状态码$code")
    }
    login("root", "1234", loginResult)

}

const val USER_NAME = "root"
const val PASS_WORD = "1234"

//定义一个登录方法
inline fun login(username: String, Passowrd: String, loginResult: (mes: String, code: Int) -> Unit) {
    if (username == USER_NAME && Passowrd == PASS_WORD) {
        loginResult("登录成功", 200)
    } else {
        loginResult("登录失败", -200)

    }
}

内联的注意事项

  • 由于JVM对普通函数已经能够根据实际情况智能地判断是否进行内联优化,所以我们并不需要对其使用Kotlin的inline语法,那只会让字节码变得更加复杂。

  • 尽量避免对具有大量函数体的函数进行内联,这样会导致过多的字节码数量。

  • 一旦一个函数被定义为内联函数,便不能获取闭包类的私有成员,除非你把它们声明为internal。

函数转函数对象

  • 这里我们发现直接引用函数报错,因为这是个函数类型的对象,那么如何把函数转化为函数对象呢我们可以使用::
package com.fyx.s1

const val USER_NAME = "root"
const val PASS_WORD = "1234"

fun main() {

    login("root", "1234", ::loginResult)

}

//函数类型
fun loginResult(mes: String, code: Int): Unit {
    println("登录的结果$mes 状态码$code")
}

//定义一个登录方法
inline fun login(username: String, Passowrd: String, loginResult: (mes: String, code: Int) -> Unit) {
    if (username == USER_NAME && Passowrd == PASS_WORD) {
        loginResult("登录成功", 200)
    } else {
        loginResult("登录失败", -200)

    }
}

返回函数参数

package com.fyx.s1


fun main() {
    var method2 = method1("详情")
    println(method2.invoke("劳烦", 18))
}

fun method1(info: String): (String, Int) -> String {
    println(info)
    return { name: String, age: Int ->
        "$name $age "
    }
}

匿名函数和具名函数

  • 匿名函数就是声明在方法内部
package com.fyx.s1

const val USER_NAME = "root"
const val PASS_WORD = "1234"

fun main() {
    login("root", "1234", { name, age ->
        println("$name + $age ")
    })
}


inline fun login(username: String, Passowrd: String, loginResult: (mes: String, code: Int) -> Unit) {
    if (username == USER_NAME && Passowrd == PASS_WORD) {
        loginResult("登录成功", 200)
    } else {
        loginResult("登录失败", -200)

    }
}
  • 具名函数是通过::把函数转换为对象函数
package com.fyx.s1

const val USER_NAME = "root"
const val PASS_WORD = "1234"

fun main() {
    login("root", "1234",::loginResult)
}

fun loginResult(mes: String, code: Int): Unit {
    println("登录的结果$mes 状态码$code")
}
 
inline fun login(username: String, Passowrd: String, loginResult: (mes: String, code: Int) -> Unit) {
    if (username == USER_NAME && Passowrd == PASS_WORD) {
        loginResult("登录成功", 200)
    } else {
        loginResult("登录失败", -200)

    }
}

Kotlin的可空特性

  • 传统的java项目中能遇到很多空指针异常而在kotlin项目中是不会遇见的
package com.fyx.s1
fun main() {
    //我们发现不能将参数设置为可空
    var name = "test"
    name = null
    //如果需要可以加一个?设置该变量可以赋值为空
    var names: String?
    names=null
}

安全调用操作符

  • 如果变量被设置为可空,那么针对该变量的所有操作函数都需要进行补救措施,意思就是当为空是就不执行
  • 使用方法就是在调用函数时在变量尾部加上?
package com.fyx.s1

fun main() {
  var name:String? ="范"
    name?.capitalize()
}

let 安全调用

  • 当值是空则走入不到let的函数内部,可以对变量进行安全校验
package com.fyx.s1

fun main() {
    var name: String? = null
    name?.let {
        println("不为空")
    }
}

!!断言操作

  • 意思是如果name空不空都会进行下一步,如果为空进行下一步则包空指针异常
package com.fyx.s1

fun main() {
    var name: String? = null
    name!!.toBigDecimal();
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:33:24  更:2021-12-04 13:34:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/19 17:30:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码