【解密 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.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. 对一个集合求和(假设它是一个数字集合)
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.xdnf.cn/news/1542804.html

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

相关文章

Spring Cloud Gateway 之动态uri 自定义过滤器

背景&#xff1a;第三方公司 请求本公司入参和出参一样的同一个接口&#xff0c;根据业务类型不一样需要不同业务微服务处理 &#xff0c;和第三方公司协商在请求头中加入业务类型方便我公司在网关成分发请求。 1&#xff1a;在spring cloud gateway yml 中加入路由 重点是 -…

人工智能领域-----机器学习和深度学习的区别

机器学习和深度学习都是人工智能领域中的重要概念&#xff0c;它们之间存在以下一些区别&#xff1a; 一、定义与概念 机器学习&#xff1a; 是一种让计算机自动学习和改进的方法&#xff0c;通过从数据中学习模式和规律&#xff0c;从而能够对新的数据进行预测或决策。涵盖了…

【C++笔试强训】如何成为算法糕手Day1

学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 笔试强训第一天 目录 循环渐进Forward-CSDN博客 第一题&#xff1a;两个数组的交集 暴力循环法&#xff1a; 哈希法 &#xff1a; 数组下标法&#xff1a; 第二题&#x…

MySQL:事务的ACID特性隔离级别脏读/不可重复读/幻读/Next-Key锁——场景复现

目录 1、什么是事务 2、 事务的ACID特性 2.1 事务的隔离性 3、为什么要使用事务&#xff1f; 4、查看支持事务的存储引擎 5、使用事务 5.1 控制事务 5.1.1 开启事务 5.1.2 关闭事务 5.2 开始一个事务&#xff0c;执行修改后回滚 5.3 开始一个事务&#xff0c;执行修…

句子成分——每日一划(十)

目录 一、原句 二、主要句子成分 三、 分词短语部分 四、定语从句部分 五、结构总结 六、句子改良 一、原句 Z-Library has always been a part of my study, providing many books that would otherwise require a lot of time or money to find. 来源&#xff1a;写作…

【网络安全】身份认证+wan优化+终端控制

用户身份认证 在允许用户访问你的网络时对其进行验证是至关重要的。不幸的是很多情况下&#xff0c;简单的用户名与密码验证并不可靠。公司通常需要更强大的针对访问信息价值较高系统(例如网络管理员系统与财务系统)的用户群体的验证。 双因子身份验证是根据“你知道的”和“你…

查询一条 SQL 语句的流程

查询一条sql语句的流程 连接器:建立连接&#xff0c;管理连接、校验用户身份查询缓存:查询语句如果命中查询缓存则直接返回&#xff0c;否则继续往下执行&#xff08;MSQL8.0 已删除&#xff09;解析 SQL&#xff1a;通过解析器对 SQL 查询语句进行词法分析、语法分析&#xf…

用uniapp 及socket.io做一个简单聊天 升级 9

比这之前优化了以下功能 上线通知 群聊里适时显示在线人数 约请好友 通过好友通过socket 相应端自动变化 PC端可以拉取摄象头拍照 PC端可以录音发送 拉起摄象头发送录象 <template><view class""><scroll-view scroll-y"true" class&…

Java启动Tomcat: Can‘t load IA 32-bit .dll on a AMD 64-bit platform报错问题解决

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

树莓派pico上手

0 介绍 不同于作为单板计算机的树莓派5&#xff0c;树莓派 pico 是一款低成本、高性能的微控制器板&#xff0c;具有灵活的数字接口。主要功能包括&#xff1a; 英国树莓派公司设计的 RP2040 微控制器芯片双核 Arm Cortex M0 处理器&#xff0c;弹性的时钟频率高达 133 MHz26…

Tomcat 靶场攻略

CVE-2017-12615 步骤一&#xff1a;环境搭建 cd vulhub/tomcat/CVE-2017-12615 docker-compose up -d docker ps 步骤二&#xff1a;漏洞复现 http://192.168.10.190:8080/ 步骤二&#xff1a;首页进行抓包 Tomcat允许适⽤put⽅法上传任意⽂件类型&#xff0c;但不允许js…

小程序-基础知识1

Mustache语法 小程序和vue一样提供了插值语法 但是小程序不能调用方法{{xxxx()}} hidden属性 hidden是所有组件都默认拥有的属性&#xff0c; hidden与wx:if的区别&#xff1a; wx:if是控制组件是否渲染,hidden控制显示或隐藏是通过添加hidden属性。 wx:for 除了可以遍历…

HCIA--实验十九:配置接口DCHP

一、实验内容 1.需求/要求&#xff1a; 通过一台5700交换机和一台PC&#xff0c;通过在交换机的接口上配置接口DHCP来实现PC自动获取ip地址。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.给vlan10配置ip地址&#xff0c;进入vlan10开启接口的DHCP&#xff1…

Java数据库连接——JDBC

目录 1、JDBC简介 2、JDBC应用 2.1 建立数据库连接 2.1.1 DriverManager静态方法获取连接 2.1.2 DataSource对象获取 2.2 获取SQL执行对象 2.2.1 SQL注入 2.2.2 Statement(执行静态SQL) 2.2.3 PreparedStatement(预处理的SQL执行对象) 2.3 执行SQL并返回结果 2.4 关…

【笔记】材料分析测试:晶体学

晶体与晶体结构Crystal and Crystal Structure 1.晶体主要特征 固态物质可以分为晶态和非晶态两大类&#xff0c;分别称为晶体和非晶体。 晶体和非晶体在微观结构上的区别在于是否具有长程有序。 晶体&#xff08;长程有序&#xff09;非晶&#xff08;短程有序&#xff09…

机器人机构、制造

简单整理一下&#xff0c;在学习了一些运动学和动力学之类的东西&#xff0c;简单的整合了一些常用的机械结构和图片。 1.电机&#xff1a; 市面上的电机有&#xff1a;直流电机&#xff0c;交流电机&#xff0c;舵机&#xff0c;步进电机&#xff0c;电缸&#xff0c;无刷电…

李宏毅结构化学习 03

文章目录 一、Sequence Labeling 问题概述二、Hidden Markov Model(HMM)三、Conditional Random Field(CRF)四、Structured Perceptron/SVM五、Towards Deep Learning 一、Sequence Labeling 问题概述 二、Hidden Markov Model(HMM) 上图 training data 中的黑色字为x&#xff…

基于单片机的水位检测系统仿真

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;DHT11温湿度检测&#xff0c;水位检测&#xff0c;通过LCD1602显示&#xff0c;超过阈值报警&#xff0c;继电器驱动电机转动。通过矩阵按键切换选择设置各项参数阈值。 …

【Linux】通过内核以太层可查看应用程序运行时访问外网情况

比如&#xff0c;SourceInsight3.exe从外网接收信息&#xff1a; 下边是运行firefox时内核打印的日志&#xff0c;可以看到浏览器运行时调用了很多的操作系统内核系统调用&#xff0c;比如&#xff1a;文件读写、网络数据包的收发等等&#xff0c;其实这些日志还并不全&#x…

基于Ambari搭建hadoop生态圈+Centos7安装教程(还没写完,等明天补充完整)

当我们学习搭建hadoop的时候&#xff0c;未免也会遇见很多繁琐的事情&#xff0c;比如很多错误&#xff0c;需要解决。在以后公司&#xff0c;也不可能让你一个一个搭建hadoop&#xff0c;成千上万的电脑&#xff0c;你再一个个搭建&#xff0c;一个个报错&#xff0c;而且每台…