Kotlin 操作符 in 的基本使用(十)

devtools/2024/9/24 13:22:34/

导读大纲

      • 1.0.1 迭代集合
      • 1.0.2 使用 in 检查集合和范围

1.0.1 迭代集合

  1. 使用 for (x in y) 循环最常见的情况对一个集合进行迭代

    • 您很可能已经熟悉它的行为–对输入集合中的每个元素都执行循环
  2. 在这种情况下,您只需打印颜色集合中的每个元素

    • 在循环内部,单个颜色可以用 color 来表示
kotlin">fun main() {val collection = listOf("red", "green", "blue")for (color in collection) {print("$color ")}// red green blue
}
  1. 再举一个例子,我们将打印字符的二进制表示
    • 为你提供一个简单的查找表,帮助你手动破译二进制编码文本
      1. 如 1000100 1000101 1000011 1000001 1000110
    • 您将这些二进制表示法存储在Map中,将一些字母的二进制表示填入其中
      1. 然后打印Map中的内容
    • <1> 可变映射保留 Kotlin 中的元素迭代顺序
    • <2> 创建范围的"…"语法不仅适用于数字,也适用于字符
      1. 在这里,我们用它来遍历从 A 到 F的所有字符对应的二进制
    • <3> 将 ASCII 码转换为二进制码
    • <4> 使用 char 作为键,将值存储在映射
    • <5> 遍历映射表,将key 指定为 letter,并将对应的value指定为binary值
    • 通过 for 循环,可以解包正在迭代的集合中的元素
      1. 本例中是 map 中的键值对集合
    • 解构的结果存储在两个独立的变量
      1. letter变量接收key,binary变量接收value
kotlin">fun main() {val binaryReps = mutableMapOf<Char, String>()         // <1>for (char in 'A'..'F') {                              // <2>val binary = char.code.toString(radix = 2)        // <3>binaryReps[char] = binary                         // <4>}for ((letter, binary) in binaryReps) {                // <5>println("$letter = $binary")}
}
==============================================
A = 1000001
B = 1000010
C = 1000011
D = 1000100
E = 1000101
F = 1000110
  1. 上述示例使用的另一个妙招是按key获取和更新 map 值的简易语法

    • 可以使用 map[key] 读取值,使用 map[key] = value 设置值
      1. 不必调用 get 和 put 等函数,拥有Python的简洁又类型安全,怎能不学
    • 这意味着无需使用 Java 风格版本的 binaryReps.put(char,binary)
      1. 而是可以使用等价但更优雅的 binaryReps[char] = binary
  2. 可以使用相同的解构语法来遍历一个列表

    • 同时跟踪当前项的索引
      1. 避免创建一个单独的变量存储索引和手动递增索引
    • <1> 将使用 withIndex 函数打印集合元素及其各自的索引
      1. 这样就可以避免创建一个单独的index变量来跟踪元素的索引值
      2. 类似Python中的: for i, elem in enumerate([1]),是不是很惊艳
kotlin">fun main() {val list = listOf("10", "11", "1001")for ((index, element) in list.withIndex()) {         // <1>println("$index: $element")}// 0: 10// 1: 11// 2: 1001
}

1.0.2 使用 in 检查集合和范围

  1. 还可以使用 in 操作符检查某个值是否在某个范围

    • 或者使用其反义词"!in"检查某个值是否不在某个范围
  2. 例如,在验证用户输入时,经常需要检查输入字符是否确实是字母或不包括数字

    • <1> 使用 in 编写一些小型辅助函数 isLetter 和 isNotDigit
      1. 检查某个字符是否属于某个字符范围
    • "c in ‘a’…‘z’"的底层工作原理仍然要
      1. 检查字符的序列码是否介于第一个字母的代码和最后一个字母的代码之间
        • 实际上会转换为判断 “‘a’ <= c && c <= ‘z’”
      2. 但这一逻辑被简洁地隐藏在标准库中 range 的实现
kotlin">fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'     // <1>
fun isNotDigit(c: Char) = c !in '0'..'9'                   // <1>
fun main() {println(isLetter('q'))// trueprintln(isNotDigit('x'))// true
}
  1. in 和 !in 操作符也可以在 when 表达式中使用
    • when表达式真的很强大–传送门
    • 需要检查多个不同的范围时,这就更加方便
    • <1> 检查数值是否在 0 到 9 的范围
    • <2> 可以合并多个范围, 即when的分支支持多个选项,以逗号分隔
kotlin">fun recognize(c: Char) = when (c) {in '0'..'9' -> "It's a digit!"                     // <1>in 'a'..'z' , in 'A'..'Z' -> "It's a letter!"      // <2>else -> "I don't know..."
}
fun main() {println(recognize('8'))// It's a digit!
}
  1. 范围也不局限于字符
    • 如果您有任何支持比较实例的类,通过实现 kotlin.Comparable 接口
      1. 就可以创建该类型对象的范围
    • <1> 底层逻辑是等同于 “Java” <= “Kotlin” && “Kotlin” <= “Scala”
      1. 请注意,这里的字符串是按字母顺序比较
        • 因为 String 类就是这样实现 kotlin.Comparable 接口
      2. 在按字母顺序排序时,"Java"排在"Kotlin"之前, 而"Kotlin"排在"Scala"之前
        • 因此 “Kotlin” 位于两个字符串之间,检查结果为true
kotlin">fun main() {println("Kotlin" in "Java".."Scala")            // <1>// true
}
  1. 同样的检查方法也适用于集合
    • <1> 该集合不包含 “Kotlin” 字符串,所以检查结果为false
kotlin">fun main() {println("Kotlin" in setOf("Java", "Scala"))   // <1>// false
}

http://www.ppmy.cn/devtools/116519.html

相关文章

第十章 【后端】商品分类管理微服务(10.7)——公共模块

10.7 公共模块 用于存放公共服务类。 10.7.1. 创建模块 10.7.2 创建实体类的超类 在父工程的 pom.xml 中添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns

用Flutter几年了,Flutter每个版本有什么区别?

用Flutter几年了&#xff0c;你知道Flutter每个版本有什么区别吗&#xff1f;不管是学习还是面试我们可能都需要了解这个信息。 Flutter 每个版本的用法基本都是一样的&#xff0c;每隔几天或者几周就会更新一个版本&#xff0c; 2018 年 12 月 5 日发布了1.x 版本&#…

python自学笔记

python部分总结 主要记录的是python与之前学的语言的不同之处 函数总结 首字母大写: name.title() 删除右边空格&#xff08;暂时&#xff09;:name.rstrip() 删除左边空格&#xff08;暂时&#xff09;:name.lstrip() 删除前缀&#xff08;暂时&#xff09;:name.removeprefi…

PMP考完之后考什么,NPDP值得考吗?

PMP考完之后先去申请一个CSPM-2级证书吧&#xff0c;现在这个证书还在推广期&#xff0c;不用参加考试就能申请增持 CSPM 证书&#xff0c;流程也很简单&#xff0c;600米申请表照片就可以了&#xff0c;有PMP的建议不要错过这个免考期~ 一、cspm是什么呢&#xff1f; CSPM是由…

流水线部署失败排查指南

在现代软件开发中&#xff0c;CI/CD&#xff08;持续集成/持续交付&#xff09;流水线是确保代码质量和快速交付的重要工具。然而&#xff0c;部署失败时&#xff0c;排查问题的能力至关重要。以下是一些常见的故障排查步骤和技巧。 ## 1. 检查流水线日志 首先&#xff0c;查看…

MySQL篇(管理工具)

目录 一、系统数据库 二、常用工具 1. mysql 2. mysqladmin 3. mysqlbinlog 4. mysqlshow 5. mysqldump 6. mysqlimport/source 6.1 mysqlimport 6.2 source 一、系统数据库 MySQL数据库安装完成后&#xff0c;自带了一下四个数据库&#xff0c;具体作用如下&#xf…

Qt笔记(十七)cmake编译Qt项目

Qt笔记&#xff08;十七&#xff09;cmake编译Qt项目 1. 文件内容与文件结构1.1.文件目录1.2. CMakeLists.txt内容1.3. main.cpp文件1.4. mouseevent.h1.5. mouseevent.cpp1.6. 生成Visual Studio项目后编译报错1.7. 界面显示中文乱码问题 1. 文件内容与文件结构 1.1.文件目录…

面试金典题2.3

若链表中的某个节点&#xff0c;既不是链表头节点&#xff0c;也不是链表尾节点&#xff0c;则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点&#xff0c;请实现一种算法&#xff0c;将该节点从链表中删除。 例如&#xff0c;传入节点 c&#xff08;位于单向链…