【解密 Kotlin 扩展函数】自定义函数(十二)

ops/2024/9/24 3:22:36/

导读大纲

    • 1.1 在 Kotlin 中创建集合
    • 1.2 自定义 joinToString 函数来实现字符串打印

1.1 在 Kotlin 中创建集合

  1. 学习如何创建集合
    • 使用setOf函数创建集合, 使用mapOf创建映射, 使用listOf创建列表
    • <1> to 并不是一个特殊的结构体, 而是一个普通函数
      1. infix修饰符表示这是一个中缀函数,Kotlin语言的又一大特性
        title
    • <2> javaClass 相当于 Java 的 getClass()
      title
kotlin">fun main() {val set = setOf(1, 7, 53)val list = listOf(1, 7, 53)val map = mapOf(1 to "one", 7 to "seven", 53 to "fifty-three")  // <1>println(set.javaClass)                   // <2>// class java.util.LinkedHashSetprintln(list.javaClass)// class java.util.Arrays$ArrayListprintln(map.javaClass)// class java.util.LinkedHashMap
}
  1. 正如所看到的,Kotlin 使用标准的 Java 集合类

    • 这对 Java 开发人员来说是个好消息: Kotlin 不会重新实现集合类
      1. 现有的所有 Java 集合知识在这里依然适用
    • 不过值得注意的是 ,与 Java 不同, Kotlin 的集合接口默认为只读
      title
    • 使用标准 Java 集合可以更轻松地与 Java 代码交互
      1. 从 Kotlin 调用 Java 函数时,不需要转换集合,反之亦然
  2. 尽管 Kotlin 的基本集合与 Java 集合是完全相同的类

    • 在 Kotlin 中可以用它们做更多的事情
      1. 从列表中获取最后一个元素
      2. 获取列表的洗牌(shuffled)版本
      3. 对一个集合求和(假设它是一个数字集合)
kotlin">fun main() {val strings = listOf("first", "second", "fourteenth")println(strings.last())println(strings.shuffled())val numbers = listOf(1,2,4,5)println(numbers.sum())
}

1.2 自定义 joinToString 函数来实现字符串打印

  1. 既然知道如何创建元素集合,我们就来做一件简单的事: 打印其中的内容
    • Java 集合有一个默认的 toString 实现
      1. 输出的格式是固定的,并不总是你所需要的
    • <1> 调用默认的 toString() 方法
kotlin">fun main() {val list = listOf(1, 2, 3)println(list)                  // <1>// [1, 2, 3]
}
  1. 试想一下,需要用分号分隔元素并用圆括号包围元素: (1; 2; 3)

    • 为了解决这个问题
      1. Java 项目会使用 Guava 和 Apache Commons 等第三方库
      2. 或者在项目内部重新实现逻辑
    • 在 Kotlin 中,标准库中有一个函数可以处理这个问题
      1. 在本节中,你将亲自实现这个函数
  2. 如下所示, joinToString 函数将集合中的元素追加到一个 StringBuilder

    • 元素之间有分隔符,开头有前缀,结尾有后缀
    • <1> 该函数是泛型函数,适用于包含任何类型元素的集合
      1. Kotlin中的泛型设计也很有意思,后面细讲
    • <2> 不要在第一个元素前添加分隔符
    • 正常来说, 除了泛型是新的知识点, 其他逻辑都应该看得懂才对
kotlin">fun <T> joinToString(                                    // <1>collection: Collection<T>,separator: String,prefix: String,postfix: String
) : String {val result = StringBuilder(prefix)for ((index, elem) in collection.withIndex()){if (index > 0) result.append(separator)          // <2>result.append(elem)}result.append(postfix)return result.toString()
}
  1. 让我们来验证一下该功能是否能正常工作
    • <1> 这个函数的实现符合预期, 大部分情况下可以保持原样
kotlin">fun main() {val list = listOf(1, 2, 3)println(joinToString(list, "; ", "(", ")"))
}
======================================  <1>
(1; 2; 3)
  1. 针对 joinToString 函数,思考以下几个问题?

    • 如何修改声明才能使函数的调用不那么冗长?
    • 每次调用调用该函数时都需要依次传递参数嘛?
    • 可以打乱顺序进行参数传递嘛?
    • 可以避免总是传递四个参数嘛?
  2. 下一节将彻底还原Kotlin标准库中 joinToString 扩展函数的实现细节


http://www.ppmy.cn/ops/115092.html

相关文章

【齐家网-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

vue组件的生命周期

一、组件运行的过程 开始--》import导入组件--》components注册组件--》以标签形式使用组件--》在内存中创建组建的实例对象--》把创建的组件实例渲染到页面上--》组件切换时销毁需要被隐藏的组件--》结束 组件的生命周期指的是&#xff1a;组件从创建、运行&#xff08;渲染…

周末总结(2024/09/22)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内&#xff0c;职场社交不要放在5min以外 职场的人际关系在面对利…

【游戏党必看】2024年最适合玩游戏的电脑系统推荐!

许多玩家都在问如果在电脑上玩游戏装什么系统好呢&#xff1f;以下系统之家小编给大家推荐两款专门为游戏玩家打造的操作系统&#xff0c;针对大型游戏进行了深度优化&#xff0c;显著提升了系统性能&#xff0c;确保游戏运行更为流畅无阻&#xff0c;能完美兼容各种类型的游戏…

使用nginx实现前端部署

1.检查nginx是否已经启动 ps -ef | grep nginx 2.将前端项目资dist文件上传到Nginx的html目录下 记得解压&#xff0c;如果是zip文件 unzip 文件.zip 3.修改Nginx配置文件nginx.conf 可以使用vim命令&#xff0c;建议直接打开文件编辑 vim /usr/local/nginx/conf/nginx.c…

对接阿里asr和Azure asr

1&#xff1a;对接阿里asr 1.1&#xff1a;pom <dependency><groupId>com.alibaba.nls</groupId><artifactId>nls-sdk-recognizer</artifactId><version>2.2.1</version> </dependency>1.2&#xff1a;生成token package c…

xxl-job、Quartz、power-job、elastic-job对比选型

一、框架对比 1. Quartz 优点&#xff1a;稳定性和可扩展性好&#xff0c;适用于企业级应用&#xff1b;调度功能丰富&#xff0c;满足多种需求。 缺点&#xff1a;本身不提供原生的分布式支持&#xff0c;需要通过扩展或与其他组件结合来实现分布式任务调度&#xff1b;调度…

演示:基于WPF的DrawingVisual开发的Chart图表和表格绘制

一、目的&#xff1a;基于WPF的DrawingVisual开发的Chart图表和表格绘制 二、预览 钻井井轨迹表格数据演示示例&#xff08;应用Table布局&#xff0c;模拟井轨迹深度的绘制&#xff09; 饼图表格数据演示示例&#xff08;应用Table布局&#xff0c;模拟多个饼状图组合显示&am…