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

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

导读大纲

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

1.0.1 迭代集合

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

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

    • 在循环内部,单个颜色可以用 color 来表示
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
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]),是不是很惊艳
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 的实现
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'))
    // true
    println(isNotDigit('x'))
    // true
}
  1. in 和 !in 操作符也可以在 when 表达式中使用
    • when表达式真的很强大–传送门
    • 需要检查多个不同的范围时,这就更加方便
    • <1> 检查数值是否在 0 到 9 的范围
    • <2> 可以合并多个范围, 即when的分支支持多个选项,以逗号分隔
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
fun main() {
    println("Kotlin" in "Java".."Scala")            // <1>
    // true
}
  1. 同样的检查方法也适用于集合
    • <1> 该集合不包含 “Kotlin” 字符串,所以检查结果为false
fun main() {
    println("Kotlin" in setOf("Java", "Scala"))   // <1>
    // false
}

http://www.kler.cn/news/316355.html

相关文章:

  • docker存储
  • 2.《DevOps》系列K8S部署CICD流水线之部署NFS网络存储与K8S创建StorageClass
  • 2016年国赛高教杯数学建模A题系泊系统的设计解题全过程文档及程序
  • Python基础学习(3)
  • SpinalHDL之结构(二)
  • rabbitmq整合skywalking并编写自定义插件增强
  • 超详图解 Apache HTTP Server(httpd)安装与验证
  • 设计模式 享元模式(Flyweight Pattern)
  • 『功能项目』QFrameWorkBug修改器界面【65】
  • 数据结构(十四)——HashMap与HashSet(OJ题)
  • Git 提交规范
  • Flyway 数据库差异处理
  • 机器人速度雅可比矩阵求解(2自由度平面关节机器人)
  • Perl 进程管理
  • 【Nginx-Location-Root】最终访问的路径是 root/$uri
  • 程序员锤炼核心竞争力的五重策略
  • 《Linux基础》练习操作
  • Redis中的setnx的使用场景
  • 2024年中国科技核心期刊目录(自然科学卷)科技统计源核心(续)
  • 网络通信——路由器、交换机、集线器(HUB)
  • 【深度学习】(5)--搭建卷积神经网络
  • 【matlab】读取rhd文件格式,intan脑电采集开源代码
  • go语言 结构体
  • 签署《AI安全国际对话威尼斯共识》 智源持续推动人工智能安全发展
  • CAN总线通信协议(基础)
  • day-58 最佳观光组合
  • JS中的for...in和for...of有什么区别?
  • MySQL篇(存储过程 触发器 存储函数)(持续更新迭代)
  • 算法:斐波那契数列
  • 什么是动态数据脱敏?