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

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

相关文章

循环中用sleep

echo <pre>;for ($i0;$i<10000000;$i){var_dump($i);} 没有用sleep,快速消耗cpu和内存 使用sleep后效果 echo <pre>;for ($i0;$i<10000000;$i){var_dump($i);usleep(1000);//php 暂停0.001秒} 总结&#xff1a;sleep能释放资源(cpu和内存)&#xff0c;但是运…

2025校招内推-招联金融

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

LeetCode 面试经典150题 191.位1的个数

Java中的算术右移和逻辑右移的区别 题目&#xff1a;编写一个函数&#xff0c;获取一个正整数的二进制形式并返回其二进制表达式中设置位的个数&#xff08;也被称为汉明重量&#xff09;。 设置位的个数即二进制中1的个数。 思路&#xff1a;方法一&#xff1a;因为正数的原…

【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型

【永磁同步电机&#xff08;PMSM&#xff09;】 4. 同步旋转坐标系仿真模型 1. Clarke 变换的模型与仿真1.1 Clarke 变换1.2 Clarke 变换的仿真模型 2. Park 变换的模型与仿真2.1 Park 变换2.2 Park 变换的仿真模型 3. Simscape标准库变换模块3.1 abc to Alpha-Beta-Zero 模块3…

java反射基础知识

1.java的反射机制 Java 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射…

学生管理系统1.0版本

学生管理系统1.0版本有5个功能&#xff0c;即添加学生、删除学生、修改学生、查看全部学生、退出系统。 里面对添加重复学号、删除和修改不存在的学号等问题都有相应的解决办法。 代码区&#xff1a; Student.java package student;//快捷键Altinsert public class Student …

Machine Learning Specialization 学习笔记(4)

文章目录 前言一、模型评估训练集常规训练集线性回归逻辑回归 交叉验证集 偏差与方差正则化 学习曲线数据集的添加&#xff08;数据增强&#xff09;迁移学习精确率与召回率 二、决策树基本概念决策树的工作原理决策树的优点决策树的缺点决策树算法的变体决策树在Python中的实现…

Shell 脚本学习

Shell学习 Shell 脚本 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服…

xxl-job使用总结

xxl-job从入门到入土 xxl-job介绍 xxl-job是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。xxl-job支持调度中心集群和执行器集群。 xxl-job开源项目 xxl-job使用 xxl-job整合SpringBoot 引入xxl-job的依赖 <dependency>…

ArcGIS核密度分析(栅格处理范围与掩膜分析)

多时候我们在进行栅格分析的时候&#xff0c;处理的结果不能完全覆盖我们需要的范围。 比如&#xff0c;我们对点数据进行密度分析、栅格插值等。比如下图 为什么会如此呢&#xff1f; 那是因为在做这个密度分析或者栅格插值的时候&#xff0c;默认是以点的四至范围来生成的&am…

LeetCode 热题 100 回顾9

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

算法之逻辑斯蒂回归(Logistic regression)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 逻辑斯蒂回归&#xff08;Logistic Regression&#xff09;是统计学中一种广泛应用于二分类问题的算法。它的主要目标是预测二分类问题中的事件发生的概率。尽管名字里有“回归”&#xff0c;但逻…

2024已然过半,AI技术卷到哪儿了?

可以说&#xff0c;科技的发展真的是日新月异&#xff0c;2024年年初&#xff0c;大模型Sora的出现&#xff0c;改变了短视频行业的演变方向&#xff0c;使得AI技术不再只是停留在文生文&#xff0c;文生图阶段&#xff0c;而是发展到了文生视频领域。2024年5月&#xff0c;回忆…

Java笔试面试题AI答之设计模式(5)

文章目录 21. 简述Java什么是适配器模式 ?适配器模式的主要组成部分包括&#xff1a;适配器模式的实现方式主要有两种&#xff1a;适配器模式的优点&#xff1a;适配器模式的缺点&#xff1a;示例说明&#xff1a; 22. 请用Java代码实现适配器模式的案例 &#xff1f; 21. 简述…

OpenCL 学习(2)---- OpenCL Platform 和 Device

目录 OpenCL PlatformOpenCL Device参考代码 OpenCL Platform opencl 支持的 Platform 可以使用 clGetPlatformIDs 函数查询&#xff0c;函数原型如下&#xff1a; clGetPlatformIDs(cl_uint /* num_entries */,cl_platform_id * /* platforms */,cl_uint * …

深度之眼(三十)——pytorch(一)--深入浅出pytorch(附安装流程)

文章目录 一、前言一、pytoch二、六个部分三、如何学习四、学习路径&#xff08;重要)五、安装pytorch5.1 坑15.2 坑2 一、前言 我看了下目录 第一章和第二章都是本科学的数字图像处理。 也就是这一专栏&#xff1a;数字图像实验。 所以就不准备学习前两章了&#xff0c;直接…

神奇的可变模板参数的应用(C++标准库双向链表 list 中的emplace函数实现)

我们先来看一个可以构造任意对象的函数&#xff1a; /// <summary> /// 可以构造任意对象的函数 /// </summary> /// <typeparam name"MyClass">要转换对象的类型</typeparam> /// <typeparam name"...MyClassConstructorParameterT…

新手上路:在Windows CPU上安装Anaconda和PyCharm

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一. 确认自己是CPU为什么选择CPU教程&#xff1f;GPU与CPU的区别如何判断自己是CPU 二. Anaconda 安装包 和 Pycharm 安装包步骤1&#xff1a;下载Anaconda步骤2&am…

摆脱困境并在iPhone手机上取回删除照片的所有解决方案

您是否无意中从 iPhone 中删除了照片&#xff1f;您&#xff0c;无需惊慌&#xff0c;因为您可以使用以下方法恢复所有照片。 如果您长时间使用 iPhone&#xff0c;您应该知道 iOS 提供了许多 Android 不提供的备份功能。例如&#xff0c;您的所有照片都会自动备份到 iCloud 存…

5分钟内理解 .prototype 链 | 2024

在JavaScript的世界里,原型(prototype)系统是一个常被讨论但不易掌握的概念。作为JavaScript继承模型的基石,理解原型对于构建大型应用或进行对象操作至关重要。让我们一起探索这个迷人的话题,揭开原型系统的神秘面纱。 什么是原型? 在JavaScript中,每个对象都有一个内部属性[…