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

news/2024/9/29 5:37:50/

导读大纲

      • 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/news/1531047.html

相关文章

软件架构的演变与趋势(软件架构演变的阶段、综合案例分析:在线电商平台架构演变、开发补充)

随着软件开发技术的不断进步&#xff0c;软件架构从最初的简单结构演变为如今的复杂系统&#xff0c;架构设计不再是简单的代码组合&#xff0c;而是战略性的系统设计&#xff0c;确保系统具备可扩展性、可靠性、安全性和可维护性。 文章目录 1. 软件架构演变的阶段1.1 单体架…

PHP常用正则表达式大全

平时做网站经常要用正则表达式&#xff0c;一些讲解和例子&#xff0c;仅供大家参考和修改使用&#xff1a; 一、匹配数字 "^\d$"  //非负整数(正整数 0)"^[0-9]*[1-9][0-9]*$"  //正整数"^((-\d)|(0))$"  //非正整数(负整数 0)"^-…

sh: write error: Invalid argument

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

Vue引入js脚本问题记录(附解决办法)

目录 一、需求 二、import引入问题记录 三、解决方式 一、需求 我想在我的Vue项目中引入jquery.js和bootstrap.js这种脚本文件&#xff0c;但发现不能单纯的import引入&#xff0c;问题如下。 二、import引入问题记录 我直接这么引入&#xff0c;发现控制台报错TypeError: …

【学习笔记】网络设备(华为交换机)基础知识7——查看硬件信息 ① display device 命令详解

提示&#xff1a;学习如何查看华为交换机的硬件信息&#xff0c;包含 display device 命令详解 一、前期准备 提示&#xff1a;下面所有学习内容都是基于以下条件完成的 条件1.已经可以正常访问交换机的命令行接口 Console口本地访问教程参考 ① &#xff1a;使用第三方工具…

Oracle 数据库常用命令与操作指南

Oracle 数据库是企业级系统中常用的数据库管理系统&#xff0c;掌握基础的命令可以让你在日常管理中更加高效。本指南将介绍几条常用的 Oracle 数据库命令&#xff0c;涵盖用户权限管理、修改用户密码、删除用户、以及其他日常操作。 目录 授权用户操作权限使用最高权限登录 O…

HarmonyOS第七章:应用状态共享(PersistentStorage、LocalStorage、AppStorage)

&#x1f389; 博客主页&#xff1a;【剑九_六千里-CSDN博客】【剑九_六千里-掘金社区】 &#x1f3a8; 上一篇文章&#xff1a;【HarmonyOS第六章&#xff1a;组件状态共享&#xff08;父子组件传参、多层级组件传参、Watch监听状态变化、Observed与ObjectLink、多层嵌套数据更…

Halcon 分类

分类是将对象分配给一组类的单个实例的术语。由特定的特征来描述对象及类。例如&#xff0c;像素的颜色或图形的形状区域。为定义类&#xff0c;必须指定特征。通过基于已知对象的训练。训练后&#xff0c;分类器将对象的特征与可用的相关特征进行比较类并返回具有最大对应关系…