有趣的 Kotlin 0x10:操作符 ..<

news2024/10/2 22:28:43

操作符 …<

..< 操作符是 Kotlin 在 1.7.20 版本中引入的不包含尾部元素的左闭右开区间操作符。之前我们使用的比较多的操作符可能是 ..until,两者均表示区间,前者是闭区间,后者则表示不包含末端元素的左闭右开区间。

@OptIn(ExperimentalStdlibApi::class)
fun main() {
    val myRange = 0.0..<10.0  // [0.0, 10.0)
    val yourRange = 0..10     // [0, 10]
    val herRange = 0 until 10 // [0, 9]
}

IDEA数学符号提示

IDEA 会通过数学符号给出明确的范围提示。

为什么需要 …< ?

针对整形, ..until 可以处理闭区间和左闭右开区间。

fun main() {
    val yourRange = 0..10     // [0, 10]
    val herRange = 0 until 10 // [0, 9]

    println(0 in yourRange)  // true
    println(10 in yourRange) // true
    println(11 in yourRange) // false

    println(0 in herRange)  // true
    println(10 in herRange) // false
    println(11 in herRange) // false
}

但是针对浮点型,之前我们只能使用.. 操作符处理闭区间,但是对应 until 的左闭右开区间却无法直接实现。

fun main() {
    val yourRange = 0.0..10.0     // [0.0, 10.0]
    val herRange = 0.0 until 10.0 //  Compile Error

    println(0.0 in yourRange)  // true
    println(10.0 in yourRange) // true
    println(11.0 in yourRange) // false
}

没有 ..< 操作符之前,要实现**[0.0,10.0)** 区间,只能使用近似的方法 nextDown,但是依然会有误差。

import kotlin.math.nextDown

fun main() {
  println(0.0..10.0.nextDown())
  // 0.0..9.999999999999998

  println(0.0..0.5.nextDown())
  // 0.0..0.49999999999999994
}

所以,我们需要 rangeUntil 操作符 ..< 帮助我们解决这个问题。

如何使用?

The new operator is Experimental, and it has limited support in the IDE.

  • 启用 -language-version 1.8 编译选项。如果是 build.gradle.kts文件,如下:
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions {
    languageVersion = "1.8"
}
  • 添加注解 @OptIn(ExperimentalStdlibApi::class)。当然 IDEA 会给予开发者提示。

示例

  • 浮点数半开半闭区间
@OptIn(ExperimentalStdlibApi::class)
fun main() {
    val myRange = 0.0..<10.0

    println(0.0 in myRange)              // true
    println(9.99999999999999 in myRange) // true
    println(10.0 in myRange)             // false
}
  • 时间半开半闭区间
import java.sql.Date
import java.time.LocalDate

@OptIn(ExperimentalStdlibApi::class)
fun main() {
    val dayOf2022 = LocalDate.of(2022, 1, 1)
    val dayOf2023 = LocalDate.of(2023, 1, 1)

    println(dayOf2022..<dayOf2023)
    // 2022-01-01..<2023-01-01

    val start = Date.valueOf("2017-01-01")
    val end = Date.valueOf("2017-12-31")
    val range = start..<end

    println(Date.valueOf("2017-05-27") in range)  // true
    println(Date.valueOf("2017-12-31") in range)  // false
    println(Date.valueOf("2018-01-01") in range)  // false
}

为什么可以实现时间类型的半开半闭区间呢?看下源码即可。

@SinceKotlin("1.7")
@ExperimentalStdlibApi
public operator fun <T : Comparable<T>> T.rangeUntil(that: T): OpenEndRange<T> = ComparableOpenEndRange(this, that)

任何实现 Comparable 接口的类都可以使用 ..< 运算符而无需显式定义其功能。

本文部分内容译自:https://medium.com/codex/theres-a-new-operator-in-kotlin-f9ad86dfbbb5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/380203.html

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

相关文章

C++ STL学习之【string类的模拟实现】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 The key is to keep company only with people who uplift you, whose presence calls forth your best. 关键是只与那些提升你的人在一起&#xff0c…

机器学习与目标检测作业(数组相加:形状需要满足哪些条件)

机器学习与目标检测&#xff08;数组相加:形状需要满足哪些条件&#xff09;机器学习与目标检测&#xff08;数组相加:形状需要满足哪些条件&#xff09;一、形状相同1.1、形状相同示例程序二、符合广播机制2.1、符合广播机制的描述2.2、符合广播机制的示例程序机器学习与目标检…

模电学习9. MOS管使用入门

模电学习9. MOS管使用入门一、mos管理简介1. 简介2. mos管理的特点3. MOS管的工作状态&#xff08;1&#xff09;放大功能&#xff08;2&#xff09;截止区&#xff08;3&#xff09;饱和区3. Mos管的分类&#xff08;1&#xff09;按照工作模式分类&#xff1a;&#xff08;2&…

25. K 个一组翻转链表

题目链接&#xff1a;https://leetcode.cn/problems/reverse-nodes-in-k-group/解题思路&#xff1a;先解决怎么翻转一段链表&#xff0c;然后在解决这道题。翻转一个链表reverse(head,tail)比如将链表1->2->3->4进行翻转&#xff0c;则翻转后的链表为&#xff1a;1&l…

Guitar Pro8免费吉他曲谱mySongBook

每周都会发布新的谱子&#xff0c;目前已有有数千首歌曲可供选择&#xff0c;在谱库中&#xff0c;您能找到 Guns N Roses&#xff0c;Miles Davis&#xff0c;Ed Sheeran 等人的经典曲目。开头我们先做一个小实验&#xff1a;现在打开你电脑里存放曲谱的文件夹&#xff0c;里面…

记录每日LeetCode 2373.矩阵中的局部最大值 Java实现

题目描述&#xff1a; 给你一个大小为 n x n 的整数矩阵 grid 。 生成一个大小为 (n - 2) x (n - 2) 的整数矩阵 maxLocal &#xff0c;并满足&#xff1a; maxLocal[i][j] 等于 grid 中以 i 1 行和 j 1 列为中心的 3 x 3 矩阵中的 最大值 。 换句话说&#xff0c;我们希…

基于Linux_ARM板的驱动烧写及连接、挂载详细过程(附带驱动程序)

文章目录前言一、搭建nfs服务二、ARM板的硬件连接三、putty连接四、挂载共享文件夹五、烧写驱动程序六、驱动程序示例前言 本文操作环境&#xff1a;Ubuntu14.04、GEC6818 这里为似懂非懂的朋友简单叙述该文章的具体操作由来&#xff0c;我们的主要目的是将写好的驱动程序烧进…

教你如何搭建设备-报修管理系统,demo可分享

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建设备-报修管理。1.2、应用场景对于故障的设备发起报修流程&#xff0c;指派人员维修&#xff0c;可查看设备维修记录。2、设置方法2.1、表单搭建1&#xff09;新建表单【设备档案-履历表】&#xff0c;字段设置如下&#xf…

低能高效打工人-查找被引文献的大牛

目录 本分享主要目标&#xff1a; Part 1 1、根据文章在wos将所需要的数据导出至excel。 2、如何判断大牛和搜索大牛 Part 2 1、下载大牛对应的文章并标记 2、文献下载 本分享主要目标&#xff1a; 1、找出引用 导师的文献 的大牛 2、根据大牛下载对应的文章并标记 Pa…

【验证码逆向专栏】某验三代、四代一键通过模式逆向分析

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 本文章未经许可禁止转载…

进程控制

文章目录进程控制子程序与父程序区别进程创建进程终止进程等待进程替换进程控制 多进程是程序进行的基本功能&#xff0c;所需要进行基础控制的操作。用来减少因为单核性能不足的原因造成的系统卡死。 子程序与父程序区别 完全继承父进程相关的内存块和数据块&#xff0c;拷贝…

【工具插件类教学】UnityPackageManager私人定制资源工具包

目录 一.UnityPackageManager的介绍 二.package包命名 三.包的布局 四.生成清单文件 五.制作package内功能 六.为您的软件包撰写文档 1.信息的结构 2.文档格式 七.提交上传云端仓库 1.生成程序集文件 2.上传至云端仓库 八.下载使用package包 1.获取包的云端路径 …

Arduino IDE启动闪退或者运行中闪退

文章目录一、你中了哪一种&#xff1f;1、安装了不符合规格的库文件2、安装了不符合规范的开发板库文件二、解决方案1、轻方案2、全盘重来Arduino IDE启动闪退或者运行中闪退&#xff0c;出现这样的问题&#xff0c;其实不需要思考了&#xff0c;就是运行库配置的问题&#xff…

clion在linux设置桌面启动图标(jetbrains全家桶均适用)

clion在linux设置桌面启动图标&#xff08;jetbrains全家桶均适用&#xff09; 网上大部分步骤都只是pycharm的教程&#xff0c;其实对于jetbrains全家桶都适合&#xff0c;vs code编辑器也可以这样。 刚开始是使用pycharm在linux设置的教程&#xff0c;参照&#xff1a;http…

计算机组成原理4小时速成3:存储器,主存ROM,RAM,cache高速缓存,辅存外设,地址编址方案,汉明码检错纠错

计算机组成原理4小时速成3&#xff1a;存储器&#xff0c;主存ROM,RAM&#xff0c;cache高速缓存&#xff0c;辅存外设&#xff0c;地址编址方案&#xff0c;汉明码检错纠错 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;…

CSS-Grid(网格)布局

前言 之前HTML 页面的布局基本上都是通过 Flexbox 来实现的&#xff0c;能轻松的解决复杂的 Web 布局。 现在又出现了一个构建 HTML 最佳布局体系的新竞争者。就是强大的CSS Grid 布局。 grid和flex区别是什么&#xff1f;适用什么场景&#xff1f; Flexbox 是一维布局系统&am…

js几种对象创建方式

适用于不确定对象内部数据方式一&#xff1a;var p new Object(); p.name TOM; p.age 12 p.setName function(name) {this.name name; }// 测试 p.setName(jack) console.log(p.name,p.age)方式二&#xff1a; 对象字面量模式套路&#xff1a;使用{}创建对象&#xff0c;同…

chatgpt 到底颠覆了什么 第一部分

ChatGPT一出来&#xff0c;一堆搞NLP的立马哭了。为什么&#xff1f;不该问为什么哭&#xff0c;而该问为什么还不哭。 有两个立马大哭的理由。 第一个理由很多人说了&#xff0c;范式改变。 虽然说没有哪个研究领域&#xff0c;甚至没有哪个领域敢说自己真的是天道酬勤绝对公平…

自己第一次在虚拟机完整部署ssm项目心得体会

过程使用资源和博文 琳哥发的linux课件文档,阳哥发的linux课件文档(私聊我要) https://www.likecs.com/show-205274015.html https://www.cnblogs.com/aluoluo/articles/15845183.html https://blog.csdn.net/osfipin/article/details/54405445 https://blog.csdn.net/drea…

【封装xib补充 Objective-C语言】

一、那么首先,咱们就从这个结果来分析 1.就不给大家一步一步分析了,直接分析我们这里怎么想的, 首先,我们看到这样的一个界面,我们想,这些应用数据是不是来源于一个plist文件吧, 所以说,我们首先要,第一步,要懒加载,把这个plist文件中的数据,加载起来, 那么,因…