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

news2024/9/24 18:47:45

导读大纲

      • 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.coloradmin.cn/o/2161118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis深度剖析:从入门到精通的实践指南

前言 什么是mybatis&#xff1f; MyBatis是一款优秀的持久层框架&#xff0c;用于简化Java应用程序与数据库之间的交互 什么是框架&#xff0c;为什么需要框架技术&#xff1f; 框架技术 是一个应用程序的半成品提供可重用的公共结构按一定规则组织的一组组件框架优势&#x…

【自动化测试】Appium 生态工具以及Appium Desktop如何安装和使用

引言 Appium 是一个开源的自动化测试框架&#xff0c;用于测试原生、移动 Web 和混合应用程序。它支持 iOS、Android 和 Windows 平台。Appium 生态系统包含多个工具和库&#xff0c;这些工具和库可以与 Appium 一起使用&#xff0c;以提高移动应用的自动化测试效率 文章目录 引…

Java面试指南(基础篇)

文章目录 前言01 Java语言的特点02 JVM、JRE及JDK的关系03 Java和C的区别04 基本数据类型05 类型转换06 自动装箱与拆箱07 String的不可变性08 字符常量和字符串常量的区别09 字符串常量池10 String 类的常用方法11 String和StringBuffer、StringBuilder的区别12 switch 是否能…

舒服了!学大模型必看的学习书籍来了

最近整理了日前市面上一大波大模型的书&#xff0c;已经打包成pdf了&#xff0c;大家有需要的&#xff0c;可以自行添加获取&#xff0c;纯福利&#xff0c;无套路&#xff0c;添加后说明是哪本书&#xff0c;会直接给大家&#xff01;&#xff08;文末获取&#xff09; 部分书…

IO 多路转接之 epoll

文章目录 IO 多路转接之 epoll1、IO 多路转接之 poll1.1、poll 函数1.2、poll 函数返回值1.3、Socket 就绪条件1.3.1、读就绪1.3.2、写就绪1.3.3、异常就绪 1.4、poll 的优点1.5、poll 的缺点1.6、poll 改写 select 2、IO 多路转接之 epoll2.1、epoll 函数2.2、epoll_create2.3…

Leetcode 反转链表

使用递归 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class S…

超低排放燃气锅炉

在全球环保浪潮的推动下&#xff0c;超低排放燃气锅炉以其卓越的环保性能和高效能源利用&#xff0c;正逐渐成为现代热能供应的主力军。作为传统锅炉的升级版&#xff0c;超低排放燃气锅炉不仅在技术上实现了质的飞跃&#xff0c;更在环保和节能方面树立了新的标杆。朗观视觉小…

linux入门到实操-10 控制台显示和输出重定向、监控文件变化、软连接

教程来源&#xff1a;B站视频BV1WY4y1H7d3 3天搞定Linux&#xff0c;1天搞定Shell&#xff0c;清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料&#xff08;包含课程同版本linux系统文件等内容&#xff09;&#xff0c;供大家学习交流下载&#xff1a;…

【Delphi】扩展现有组件创建新的 FireMonkey 组件(步骤一)

本例中演示将TLabel控件扩展成TClockLabel新控件。具体如下&#xff1a; 步骤 1 - 使用新建组件向导创建组件 1. 菜单选择 Component -> New Component。 2. 在新建组件向导的第一页&#xff0c;选择 FireMonkey for Delphi &#xff1a; 3. 在 “Ancestor Component ”页…

【最新华为OD机试E卷-支持在线评测】爱吃蟠桃的孙悟空(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

解决windows上VMware的ubuntu虚拟机不能拷贝和共享

困扰多时的VMware虚拟机不能复制拷贝和不能看到共享文件夹的问题&#xff0c;终于解决了~ 首先确定你已经开启了复制拷贝和共享文件夹&#xff0c;并且发现不好用。。。 按照下面方式解决这个问题。 1&#xff0c;删除当前的vmware tools。 sudo apt-get remove --purge ope…

【Redis技术进阶之路】「原理分析系列开篇」揭秘分析客户端和服务端网络通信交互实现(客户端篇)

揭秘高效存储模型与数据结构底层实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 客户端和服务器Redis服务器IO多路复用RedisClient结构 客户端属性分析套接字描述符客户端的分类伪客户端…

【二十五】【QT开发应用】无边窗窗口鼠标拖动窗口移动,重写mousePressEvent,mouseMoveEvent函数

在 Qt 中&#xff0c;可以通过在自定义的类中重载 mousePressEvent 和 mouseMoveEvent 函数来捕获鼠标按下和移动事件&#xff0c;以便实现例如拖动窗口等功能。 mousePressEvent 和 mouseMoveEvent分别是鼠标按下事件和鼠标移动事件。这两个函数是QT中本身就存在的函数&#…

prithvi WxC气象模型

NASA发布了prithvi WxC气象模型发布 Prithvi是NASA开源的模型&#xff0c;被誉为全球最大的开源地理空间大模型。昨天晚上逛X平台&#xff0c;我看到Prithvi模型又来了新成员&#xff1a;prithvi WxC。 NASA和IBM创建了一个基于MERRA-2数据的天气和气候AI基础模型—Prithvi Wx…

C++ :借助栈完成二叉树的非递归遍历

二叉树的传统访问分为&#xff1a;前序、中序、后序、层序。 其中前三者是递归访问&#xff0c;但是递归是有缺陷的&#xff0c;树太深就会栈溢出。 因此本文我们思考如何使用非递归的方法来完成遍历。 1. 前序遍历 要迭代⾮递归实现⼆叉树前序遍历&#xff0c;⾸先还是要借…

【计算机组成原理】实验一:运算器输入锁存器数据写实验

目录 实验要求 实验目的 主要集成电路芯片及其逻辑功能 实验原理 实验内容及步骤 实验内容 思考题 实验要求 利用CP226实验箱上的K16&#xff5e;K23二进制拨动开关作为DBUS数据输入端&#xff0c;其它开关作为控制信号的输入端&#xff0c;将通过K16&#xff5e;K23设定…

无人经济已经 next level 了吗?

01 从无人售货机开始… 晚上 11 点下班回到小区&#xff0c;顺便去驿站取个快递&#xff0c;走进驿站发现四周空无一人&#xff0c;把快递放在机器上滴一声就可以走人了。走的时候在旁边的无人超市里拿一袋方便面&#xff0c;当做加班的安慰……发现了吗&#xff0c;无人门店…

ret2dl_resolve

前言&#xff1a; ret2dl_resolve 是一种利用漏洞进行攻击的技术&#xff0c;主要针对使用动态链接库的程序。它的核心原理是利用程序的重定位机制&#xff0c;通过构造特定的函数返回地址&#xff0c;来劫持控制流并执行攻击者选择的代码。以下是对 ret2dl_resolve 原理的详细…

谷歌地图 | Navigation SDK 重磅发布!为你的 App 注入导航新体验

9月17日&#xff0c;Google 地图正式发布 Navigation SDK for Android 和 iOS&#xff01;借助 Navigation SDK&#xff0c;开发者们现在可以更轻松地为用户打造定制化的导航体验&#xff0c;提升用户满意度&#xff0c;增强用户粘性。无论是界面风格、路线规划还是实时交通信息…

城市酷选:如何四年做到3000亿销售额 会员超500w

城市酷选&#xff0c;这一融合了线上线下消费的会员制社交电商平台&#xff0c;正以其独特的运营模式在市场中崭露头角。该平台不仅汇聚了超过600万的会员与60万商家&#xff0c;更实现了年交易额的百亿突破&#xff0c;彰显了其强大的市场影响力和消费者吸引力。 创新排队免单…