• Kotlin第六弹:Kotlin方法与Lambda表达式


    会一直坚持写关于Kotlin的入门系列文章,赶紧关注一起学习吧!


    前言

    经过前面对 Kotlin 的介绍,相信大家已经能对 Kotlin 有了一个基本的认识。 从这节开始,我就为大家讲解 Kotlin的方法以及Lambda表达式等高级操作。


    一、Kotlin的方法

    1、方法声明

    1. fun functionLearn(days: Int): Boolean {
    2. return days > 100
    3. }

     成员方法

    1. //成员方法
    2. class Person {
    3. fun test1() {
    4. println("成员方法")
    5. }
    6. }
    7. Person().test1()

    类方法 

    Kotlin 中并没有 static 关键字,不过我们可以借助 companion object 来实现 类方法的目的。

    (1)companion object 实现的类方法

    1. class Person {
    2. companion object {
    3. fun test2() {
    4. println("companion object 实现的类方法")
    5. }
    6. }
    7. }
    8. Person.test2()

    (2)静态类

        如果我们想实现一个工具 util 的话,可以借助 object 来创建一个静态类:

    1. /**
    2. * 整个静态类
    3. */
    4. object NumUtil {
    5. fun double(num: Int): Int {
    6. return num * 2
    7. }
    8. }

     (3)全局静态

         我们可以直接新建一个 Kotlin file 然后定义一些常量、方法。

    单表达式方法

    当方法返回单个表达式时,可以省略花括号并且在 = 符号之后指定代码体即可:

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

    当返回值类型可由编译器推断时,显式声明返回类型是可选的:

    fun double(x: Int) = x * 

    2、方法参数

    默认参数

    方法参数可以有默认值,当省略相应的参数时使用默认值。与其 Java 相比, 这可以减少重载数量:

    fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size) { /*……*/ }

     我们可以通过类型后面的 = 来设置默认值。

     如果一个默认参数在一个无默认值的参数之前,那么该默认值只能通过使用 具名参数调用该方法   来使用:

    1. fun foo(bar: Int = 0, baz: Int) { /*……*/ }
    2. foo(baz = 1) // 使用默认值 bar = 0

     如果在默认参数之后的最后一个参数是 lambda 表达式,那么它既可以作为 具名参数在括号内传   入,也可以在括号外传入:

    1. fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) { /*……*/ }
    2. foo(1) { println("hello") } // 使用默认值 baz = 1
    3. foo(qux = { println("hello") }) // 使用两个默认值 bar = 0 与 baz = 1
    4. foo { println("hello") } // 使用两个默认值 bar = 0 与 baz = 1

    可变数量的参数

    方法的参数(通常是最后一个)可以用 vararg 修饰符标记:

    1. fun append(vararg str: Char): String {
    2. val result = StringBuffer()
    3. for (char in str) {
    4. result.append(char)
    5. }
    6. return result.toString()
    7. }

     允许将可变数量的参数传递给方法:

    append('h', 'e', 'l', 'l', 'o')

     可变参数的要求:

            • 只有一个参数可以标注为 vararg;

            • 如果 vararg 参数不是列表中的最后一个参数, 可以使用具名参数语 法传递其后的参数的              值,或者,如果参数具有方法类型,则通过在括 号外部传一个 lambda。

    当我们调用 vararg 方法时,我们可以一个接一个地传参,例如 append('h', 'e', 'l', 'l', 'o'),或者,如果我们已经有一个数组并希望将其内容传给该方法, 我们使用伸展(spread)操作符(在数组前面加 *):

    1. val world = charArrayOf('w', 'o', 'r', 'l', 'd')
    2. val result = append('h', 'e', 'l', 'l', 'o',' ', *world)

    3、方法作用域 

    在 Kotlin 中方法可以在文件顶层声明,这意味着你不需要像一些语言如 Java、C# 那样需要创建一个类来保存一个方法。 此外除了顶层方法, Kotlin 中方法也可以声明在局部作用域、作为成员方法以及扩展方法。

    局部方法

    Kotlin 支持局部方法,即一个方法在另一个方法内部:

    1. fun magic(): Int {
    2. fun foo(v: Int): Int {
    3. return v * v
    4. }
    5. val v1 = (0..100).random()
    6. return foo(v1)
    7. }

     局部方法可以访问外部方法(即闭包)的局部变量。


    二、Lambda表达式

    在 Java 8 的时候开始支持 Lambda 表达式,目前 Lambda 语法在 Java 中已 经被广泛的运用,Lambda 表达式可以理解为是一种语法糖,值得庆幸的 是,Kotlin 一经开源成熟就已经支持这种语法。

    Lambda 表达式的本质其实是匿名方法,因为在其底层实现中还是通过匿名 方法来实现的。但是我们在用的时候不必关心起底层实现。不过 Lambda 的 出现确实是减少了代码量的编写,同时也是代码变得更加简洁明了。

    Lambda 作为方法式编程的基础,其语法也是相当简单的。这里先通过一段 简单的代码演示没让大家了解 Lambda 表达式的简洁之处:

    1. view.setOnClickListener(new View.OnClickListener() {
    2. @Override
    3. public void onClick(View v) {
    4. Toast.makeText(v.getContext(), "Lambda 简洁之道",
    5. Toast.LENGTH_LONG).show();
    6. }
    7. });

    VS

    1. view.setOnClickListener { v -> Toast.makeText(v.context, "Lambda 简洁之道
    2. ", Toast.LENGTH_LONG).show() }

    1.Lambda 表达式的特点

    语法如下:

    无参数的情况 :

    val/var 变量名 = { 操作的代码 }

    有参数的情况:

    1. val/var 变量名 : (参数的类型,参数类型,...) -> 返回值类型 = {参数 1,参数
    2. 2,... -> 操作参数的代码 }

    可等价于 

    1. // 此种写法:即表达式的返回值类型会根据操作的代码自推导出来。
    2. val/var 变量名 = { 参数 1 : 类型,参数 2 : 类型, ... -> 操作参数的代码 }

    lambda 表达式作为方法中的参数的时候,这里举一个例子:

    1. fun test(a : Int, 参数名 : (参数 1 : 类型,参数 2 : 类型, ... ) -> 表达式返回
    2. 类型){
    3. ...
    4. }

    2.Lambda 实践

    如何使用 it

    认识 it

    • it 并不是 Kotlin 中的一个关键字(保留字)

    • it 是在当一个高阶方法中 Lambda 表达式的参数只有一个的时候可以使用 it 来使 用此参数

    • it 可表示为单个参数的隐式名称,是 Kotlin 语言约定的

    • 实例 A:单个参数的隐式名称

    1. // 这里举例一个语言自带的一个高阶方法 filter,此方法的作用是过滤掉不满足条
    2. 件的值。
    3. val arr = arrayOf(1,3,5,7,9)
    4. // 过滤掉数组中元素小于 2 的元素,取其第一个打印。这里的 it 就表示每一个元
    5. 素。
    6. • println(arr.filter { it < 5 }.component1())
    7. //结合上文的
    8. • testClosure(1)(2) {
    9. • println(it)
    10. • }

     如何使用下划线_

    在使用 Lambda 表达式的时候,可以用下划线(_)表示未使用的参数,表示不 处理这个参数。

    在遍历一个 Map 集合的时候,这当非常有用

    1. val map = mapOf("key1" to "value1", "key2" to "value2", "key3" to
    2. "value3")
    3. map.forEach { (key, value) ->
    4. println("$key \t $value")
    5. }
    6. // 不需要 key 的时候
    7. map.forEach { (_, value) ->
    8. println(value)
    9. }

    总结

    提示:这里对文章进行总结:
    例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 相关阅读:
    python 星号(*) 还能这么用
    34. 在排序数组中查找元素的第一个和最后一个位置
    电荷泵CP原理及在PLL/DLL中的使用
    SpringBoot_redis使用实战(四)_消息模式
    算法学习笔记(7.4)-贪心算法(区间调度问题)
    IBM Spectrum LSF 作业调度系统,简化计算集群管理并划分工作负载优先级
    node/npm/nvm node /以及镜像的安装和使用
    一文看懂推荐系统:召回02:Swing 模型,和itemCF很相似,区别在于计算相似度的方法不一样
    数据结构——分块查找
    从暗黑3D火炬之光技能系统说到-Laya非入门教学一~资源管理
  • 原文地址:https://blog.csdn.net/m0_58941767/article/details/126806222