【解密 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.rhkb.cn/news/430876.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LLM多模态】Animatediff文生视频大模型

note AnimateDiff框架&#xff1a;核心是一个可插拔的运动模块&#xff0c;它可以从真实世界视频中学习通用的运动先验&#xff0c;并与任何基于相同基础T2I的个性化模型集成&#xff0c;以生成动画。训练策略&#xff1a;AnimateDiff的训练包括三个阶段&#xff1a; 领域适配…

spark之不同序列化对比

一&#xff0c;spark的rdd的序列话不同介绍 下面是使用不同序列化后的占用资源和数据大小 2&#xff0c;sparksql中序列化的区别 sparksql中使用序列化和不使用差别不大&#xff0c;英文sparksql中默认使用了encode自己实现的序列化方法&#xff0c;加上与不加序列化差别不大…

基于真实山地场景下的超多目标优化算法求解无人机三维路径规划,MATLAB代码

超多目标优化算法是一类专门用于解决存在三个以上目标函数的最优化问题的算法。这类问题在现实世界中非常常见&#xff0c;例如在工程设计、资源管理、机器学习等领域。由于目标之间的冲突性&#xff0c;很难找到一个单一的解来同时优化所有目标&#xff0c;因此超多目标优化算…

MQ高级(二):死信交换机--延迟消息及DelayExchange插件--超时订单案例实现

目录 1.延迟消息 1.1.死信交换机和延迟消息 1.1.1.死信交换机 1.1.2.延迟消息 1.2.DelayExchange插件 1.2.1.下载 1.2.2.安装 1.2.3.声明延迟交换机 1.2.4.发送延迟消息 1.3.超时订单问题 1.3.1.定义常量 1.3.2.配置MQ 1.3.3.改造下单业务&#xff0c;发送延迟消息…

【Linux篇】TCP/IP协议(笔记)

目录 一、TCP/IP协议族体系结构 1. 数据链路层 &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;常用协议 ① ARP协议&#xff08;Address Resolve Protocol&#xff0c;地址解析协议&#xff09; ② RARP协议&#xff08;Reverse Address Resolve Protocol&…

详解Web测试和APP测试的区别

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 最近听到有些朋友说&#xff0c;移动端要比web端稍微难一些&#xff0c;涉及到的细节笔记要多&#xff0c;有转去做web测试的想法&#xff0c;看看在具体测试的…

秋招面试准备:《小米2024数字芯片岗面试题》

在数字芯片设计的浪潮中&#xff0c;验证工程师的角色愈发重要。他们如同守门人&#xff0c;确保每一块芯片在投入市场前都能稳定、高效地运行。小米&#xff0c;作为全球知名的智能设备制造商&#xff0c;对数字芯片岗位的人才选拔尤为严格。 本文分享《小米2024数字芯片岗面…

专属文生图助手——SD3+ComfyUI文生图部署步骤

SD3ComfyUI文生图部署步骤 我们使用DAMODEL来实现文生图的部署。 根据提供的操作步骤与代码段落&#xff0c;本文旨在介绍如何下载并部署 Stable Diffusion 3 模型&#xff0c;并通过 ComfyUI 架构实现基于 Web 界面的图像生成应用。本文将剖析各个步骤&#xff0c;并详细解释…

[Redis][Hash]详细讲解

目录 0.前言1.常见命令1.HSET2.HGET3.HEXISTS4.HDEL5.HKEYS6.HVALS7.HGETALL8.HMGET9.HLEN10.HSETNX11.HINCRBY12.HINCRBYFLOAT 2.内部编码1.ziplist(压缩链表)2.hashtable(哈希表) 3.使用场景4.缓存方式对比1.原⽣字符串类型2.序列化字符串类型3.哈希类型 0.前言 在Redis中&am…

同一网络下两台电脑IP一样吗?探究局域网内的IP分配机制

在日常生活和工作中&#xff0c;我们经常会在同一网络环境下使用多台电脑。这时&#xff0c;一个常见的问题就会浮现&#xff1a;同一网络下两台电脑IP一样吗&#xff1f;这个问题看似简单&#xff0c;但实际上涉及到局域网内的IP分配机制。本文将深入探讨这一问题&#xff0c;…

Linux使用Clash,clash-for-linux

文件下载 clash-for-linuxhttps://link.zhihu.com/?targethttps%3A//zywang.lanzn.com/ijE2a1m7h6mb&#xff08;百度和阿里云盘都不支持这个文件分享&#xff09;。 使用须知 - 此项目不提供任何订阅信息&#xff0c;请自行准备Clash订阅地址。 - 运行前请手动更改.env文件…

使用四叉树碰撞的游戏 显微镜RPG

实现四叉树碰撞检测 //author bilibili 民用级脑的研发记录 // 开发环境 小熊猫c 2.25.1 raylib 版本 4.5 // 2024-7-14 // AABB 碰撞检测 在拖拽&#xff0c;绘制&#xff0c;放大缩小中 // 2024-7-20 // 直线改每帧打印一个点&#xff0c;生长的直线&#xff0c;直线炮弹 /…

The NCCoE’s Automation of the CMVP

Earlier today at the ICMC24, we heard from a panel about the US National Cybersecurity Center of Excellence’s (NCCoE) work on the Automated Cryptographic Module Validation Program (ACMVP), which intends to tackle the troublingly long queue times we’ve se…

Flink 与 Kubernetes (K8s)、YARN 和 Mesos集成对比

Flink 与 Kubernetes (K8s)、YARN 和 Mesos 的紧密集成&#xff0c;是 Flink 能够在不同分布式环境中高效运行的关键特性。 Flink 提供了与这些资源管理系统的深度集成&#xff0c;以便在多种集群管理环境下提交、运行和管理 Flink 作业。Flink 与 K8s、YARN 和 Mesos 集成的详…

百度Android IM SDK组件能力建设及应用

作者 | 星途 导读 移动互联网时代&#xff0c;随着社交媒体、移动支付、线上购物等行业的快速发展&#xff0c;对即时通讯功能的需求不断增加。对于各APP而言&#xff0c;接入IM SDK&#xff08;即时通讯软件开发工具包&#xff09;能够大大降低开发成本、提高开发效率&#…

数据结构:(OJ141)环形列表

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…

C++ | Leetcode C++题解之第420题强密码检验器

题目&#xff1a; 题解&#xff1a; class Solution { public:int strongPasswordChecker(string password) {int n password.size();bool has_lower false, has_upper false, has_digit false;for (char ch: password) {if (islower(ch)) {has_lower true;}else if (isu…

渗透测试综合靶场 DC-2 通关详解

一、准备阶段 准备工具如Kali Linux&#xff0c;下载并设置DC-2靶场机。确保攻击机和靶机在同一网络段&#xff0c;通常设置为桥接模式或NAT模式。 1.1 靶机描述 Much like DC-1, DC-2 is another purposely built vulnerable lab for the purpose of gaining experience in …

面试知识点总结篇二

一、makefile链接库参数 LIBS -L/path/to/lib -lmylib//&#xff0c;-lmylib会链接名为libmylib.so或libmylib.a的库。all: myprogrammyprogram: myprogram.ogcc -o myprogram myprogram.o $(LIBS)//此处使用myprogram.o: myprogram.cgcc -c myprogram.c二、shell指令 Shell…

高性能分布式搜索引擎Elasticsearch详解

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…