当前位置: 首页 > article >正文

【解密 Kotlin 扩展函数】命名参数和默认值(十三)

导读大纲

      • 1.0.1 命名参数
      • 1.0.2 默认参数值

  1. 上一节讲述如何自定义 joinToString 函数来代替集合的默认字符串表示
    • 文末遗留下几个待优化问题–传送门

1.0.1 命名参数

  1. 我们要解决的第一个问题涉及函数调用的可读性

    • 例如,请看下面的joinToString调用: joinToString(collection," “,” “,”.")
      1. 你能知道所有这些字符串对应的参数是什么吗?
      2. 你能知道这些元素是用空格还是点分隔的?
    • 如果不查看函数的签名,就很难回答这些问题
      1. 也许你的集成开发环境能帮到你,但单纯从调用代码中是看不出来
        title
  2. 这个问题在布尔(Boolean)标志中尤其常见

    • 为了解决这个问题,一些 Java 编码风格建议
      1. 创建枚举类型,而不是使用布尔类型
    • <1> 还有一些参数甚至需要在注释中明确指定参数名
      1. 比如下面的代码块中使用/* separator */ 来指定对应的参数名
    • <2> 有了 Kotlin, 我们可以优雅地解决, 因为 Kotlin 支持命名参数
      title
=================================== <1>
/* Java */
joinToString(collection, /* separator */ " ", /* prefix */ " ",
/* postfix */ ".");
==================================== <2>
fun main() {
    val list = listOf(1, 2, 3)
    println(joinToString(list, separator = "; ", prefix = "(", postfix = ")"))
    // (1; 2; 3)
}
  1. 调用 Kotlin 编写的函数时,可以指定传递给函数的部分(或全部)参数的名称
    • 如果指定传递给函数的所有参数的名称,甚至可以更改它们的传参顺序
      title
fun main() {
    val list = listOf(1, 2, 3)
    println(joinToString(separator = "; ", postfix = ")", prefix = "(", collection = list ))
    // (1; 2; 3)
}
  1. 如果重新命名被调用函数的参数
    • IntelliJ IDEA 和 Android Studio可以使显式编写的参数名称保持最新
    • **使用"重命名"(Rename)或"更改签名"(Change Signature)**操作
      1. 这两种操作都可以通过**右键单击函数名并选择"重构(Refactor)"**选项
        title

1.0.2 默认参数值

  1. Java 的另一个常见问题某些类中的重载方法过多

    • java.lang.Thread及其八个构造函数
      title
    • 提供重载可能是为了向后兼容、方便 API 用户或其他原因
      1. 最终结果都是一样的: 重复
    • 参数名称和类型一次又一次地重复
      1. 如果要彻底的话,还得在每个重载中重复大部分文档
    • 同时,如果调用一个省略某些参数的重载
      1. 不总是很清楚它们使用哪些参数
  2. 在 Kotlin 中,由于可以在函数声明中指定参数的默认值

    • 因此通常可以避免创建重载
  3. 在大多数情况下,字符串可以用逗号分隔,不需要任何前缀或后缀

    • <1> 因此,我们可以将这些参数设为默认值
    • <2> 可以调用函数的所有参数, 也可以省略部分参数以使用对应的默认值
      1. 可以看到三种不同形式的参数传递都是ok的
fun <T> joinToString(
    collection: Collection<T>,
    separator: String = ", ",            // <1>
    prefix: String = "",                 // <1>
    postfix: String = ""                 // <1>
) : String {
    val result = StringBuilder(prefix)
    for ((index, elem) in collection.withIndex()){
        if (index > 0) result.append(separator)
        result.append(elem)
    }
    result.append(postfix)
    return result.toString()
}
fun main() {
    val list = listOf(1, 2, 3)
    println(joinToString(list, ", ", "", ""))         // <2>
    println(joinToString(list))                       // <2>
    println(joinToString(list, separator = "; "))     // <2>
}
========================================
1, 2, 3
1, 2, 3
1; 2; 3
  1. 众所周知,Java中是没有默认参数值的概念
    • 那么如何在Java中调用具有默认参数的Kotlin函数呢?
    • 下一节将进入一个新的专题系列:Kotlin 与 Java 的互操作

http://www.kler.cn/news/315911.html

相关文章:

  • 【深入Java枚举类:不仅仅是常量的容器】
  • 数据结构——串的模式匹配算法(BF算法和KMP算法)
  • 设计模式-装饰者模式
  • VMware虚拟机经常性卡死,打开运行一段时间后卡死,CPU占比增至100%
  • 电脑网络怎么弄动态ip :步骤详解与优势探讨
  • Tomcat系列漏洞复现
  • AI时代最好的编程语言应该选择谁?
  • vue h5 蓝牙连接 webBluetooth API
  • MySQL 中删除重复的数据并只保留一条
  • C#实现指南:将文件夹与exe合并为一个exe
  • vscode 环境搭建
  • 神经网络修剪实战
  • ubuntu安装docker compose
  • 解决 TortoiseGitPlink Fatal Error:深入解析
  • JS巧用.padStart()|.padEnd()方法用另一个字符串填充当前字符串
  • 9月16日笔记
  • 工作笔记:Vue 3 中使用 vue-router 进行导航与监听路由变化
  • 关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法
  • 使用Stream实现事件流
  • Django一分钟:借助Django的认证系统快速实现RBAC权限校验以及Session会话
  • 深入浅出:Eclipse 中配置 Maven 与 Spark 应用开发全指南
  • 一个能同时to B和to C、批发零售一体化的需求分析和系统设计
  • 达梦数据库对象管理(三):索引
  • 使用vue创建项目
  • 蓝桥杯模块一:LED指示灯的基本控制
  • JavaEE: 深入探索TCP网络编程的奇妙世界(四)
  • 视频工具EasyDarwin将本地视频生成RTSP给WVP拉流列表
  • 基于51单片机的手环设计仿真
  • LeetCode 热题 100 回顾8
  • 【STM32】TIM定时器定时中断与定时器外部时钟的使用