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

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

导读大纲

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

1.1 在 Kotlin 中创建集合

  1. 学习如何创建集合
    • 使用setOf函数创建集合, 使用mapOf创建映射, 使用listOf创建列表
    • <1> to 并不是一个特殊的结构体, 而是一个普通函数
      1. infix修饰符表示这是一个中缀函数,Kotlin语言的又一大特性
        title
    • <2> javaClass 相当于 Java 的 getClass()
      title
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.LinkedHashSet
    println(list.javaClass)
    // class java.util.Arrays$ArrayList
    println(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. 对一个集合求和(假设它是一个数字集合)
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() 方法
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> 不要在第一个元素前添加分隔符
    • 正常来说, 除了泛型是新的知识点, 其他逻辑都应该看得懂才对
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> 这个函数的实现符合预期, 大部分情况下可以保持原样
fun main() {
    val list = listOf(1, 2, 3)
    println(joinToString(list, "; ", "(", ")"))
}
======================================  <1>
(1; 2; 3)
  1. 针对 joinToString 函数,思考以下几个问题?

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


http://www.kler.cn/a/321076.html

相关文章:

  • 利用云计算实现高效的数据备份与恢复策略
  • HarmonyOS 开发环境搭建
  • CSS回顾-基础知识详解
  • JWTUtil工具类
  • 插入排序——希尔排序
  • AdaBoost 二分类问题
  • Java 编码系列:线程基础与最佳实践
  • TS系列(3):常用类型(详细)
  • 把握旅游新契机,开启旅游创业新征程
  • 【Springboot入门-自动配置】
  • 【Qualcomm】高通SNPE框架的使用 | 原始模型转换为量化的DLC文件 | 在Android的DSP端运行模型
  • filebeat采集挂载出来的/home/Logs下的日志过程
  • 数据库 - MySQL的事务
  • TikTok直播推流不精准该怎么办?跟IP有关系吗?
  • 【北京迅为】《STM32MP157开发板使用手册》-第四十三章 软件定时器实验
  • 基于SpringBoot的图书进销存管理系统【附源码】
  • 利用Spring Boot开发学生宿舍管理系统
  • 十一、SOA(SOA的具体设计模式)
  • 【中级通信工程师】终端与业务(三):电信业务
  • leetcode-10. 正则表达式匹配
  • element ui中当el-dialog需要做全屏时,.fullscreen样式修改问题
  • windows电脑git提交告警:LF will be replaced by CRLF the next time Git touches it
  • 包/环境管理工具pip和conda介绍
  • Avalonia的第三方UI库SukiUI详细教程
  • 如何将 Apifox 的自动化测试与 Jenkins 集成?
  • linux-----进程控制