有趣的 Kotlin 0x10:操作符 ..<
操作符 …<
..<
操作符是 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 会通过数学符号给出明确的范围提示。
为什么需要 …< ?
针对整形, ..
和 until
可以处理闭区间和左闭右开区间。
fun main() {val yourRange = 0..10 // [0, 10]val herRange = 0 until 10 // [0, 9]println(0 in yourRange) // trueprintln(10 in yourRange) // trueprintln(11 in yourRange) // falseprintln(0 in herRange) // trueprintln(10 in herRange) // falseprintln(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 Errorprintln(0.0 in yourRange) // trueprintln(10.0 in yourRange) // trueprintln(11.0 in yourRange) // false
}
没有 ..<
操作符之前,要实现**[0.0,10.0)** 区间,只能使用近似的方法 nextDown
,但是依然会有误差。
import kotlin.math.nextDownfun main() {println(0.0..10.0.nextDown())// 0.0..9.999999999999998println(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.0println(0.0 in myRange) // trueprintln(9.99999999999999 in myRange) // trueprintln(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-01val start = Date.valueOf("2017-01-01")val end = Date.valueOf("2017-12-31")val range = start..<endprintln(Date.valueOf("2017-05-27") in range) // trueprintln(Date.valueOf("2017-12-31") in range) // falseprintln(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
相关文章:

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

mysql数据库之索引使用原则
一、最左前缀法则。 1、如果索引使用了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。 如果跳跃到某一列,索引将部分失效(后面的字段索引失效&am…...

【Java】Spring Boot 日志文件
文章目录SpringBoot日志文件1. 日志有什么用2. 日志怎么用3. 自定义日志打印3.1 在程序中得到日志对象3.2 使用日志对象打印日志4. 日志级别4.1 日志级别有什么用?4.2 日志级别的分类与使用5. 日志持久化6. 更简单的日志输出--lombok6.1 添加 lombok 依赖6.2 输出日…...

软件项目管理计算题复习(1)
软件项目管理计算题复习(1) 1.关键路径:决定项目最早完成的一系列的活动。网络图中最长的路,最少的时差,总是差为0,也是关键路径。 2.最短路径也是最短工期 3.总时差:最晚开始-最早开始最晚结…...

BMI160 BOSCH/博世 六轴 加速度 陀螺仪 传感器
BMI160 6轴惯性运动传感器,采用MEMS传感器封装,将16位3轴加速度计和超低功耗3轴陀螺仪集成在一起。当加速度计和陀螺仪在全速模式下运行时,耗电典型值低至950A,仅为市场上同类产品耗电量的50%或者更低。 Bosch BMI160专为智能手机…...
ROS探索[wpr_simulation的编译]
遇到的多种挑战最终的解决方式是通过重新删除所有编译文件夹重新生成工程原因如下 第一次生成的catkin_make文件的时候针对环境变量进行了设置,如果不删除环境变量相关的设置则后续新装的工具工程都会受到影响掣肘Protocbuf相关问题系统中存在多个版本的Protocbuf,因此优先级…...

连接Oracle数据库失败(ORA-12514)故障排除
文章目录症状产生原因解决办法欢迎加下方我的微信👇,拉你入学习群点击试看博主的专著《MySQL 8.0运维与优化》(清华大学出版社)ORA-12514的故障是很多新手在连接Oracle数据库时经常遇到故障,它通常表示无法连接到数据库…...

DevOps 学习笔记(一) | DevOps 简介及环境搭建
1. 环境配置 本次实验需要三台服务器CI/CD 服务器、应用服务器和Harbor 服务器 DevOps 步骤 程序员将代码 push 到代码仓库Jenkins 根据触发条件拉取代码到CI/CD 服务器Jenkins 使用 Maven 将代码 build 成 jar 包Jenkins 使用 jar 包通过 Dockerfile 和 docker-compose.yml…...
日志收集笔记(Filebeat 日志收集、Logstash 日志过滤)
1 FileBeat Filebeat 是使用 Golang 实现的轻量型日志采集器,也是 Elasticsearch stack 里面的一员。本质上是一个 agent ,可以安装在各个节点上,根据配置读取对应位置的日志,并上报到相应的地方去。 1.1 FileBeat 安装与使用 …...

字节二面,原来是我对自动化测试的理解太浅薄了..
如何使用Python实现自动化测试 如果你入职一家新的公司,领导让你开展自动化测试,作为一个新人,你肯定会手忙脚乱,你会如何落地自动化测试呢?资深测试架构师沉醉将告诉你如何落地自动kan化测试,本次话题主要…...

2023雅虎邮箱不能注册?别急,这份教程教你成功注册雅虎邮箱
这几年,跨境电商的迅猛发展,越来越多人加入这片蓝海,跨境人拥有一个专业的邮箱账户显得尤为重要,它是商业交流和日常工作的必备工具。因此,雅虎邮箱成为了许多人的首选,全球范围内使用雅虎邮箱的人数是非常…...
Elasticsearch 自动补全 completion type
Elasticsearch 自带一种自动补全类型 completion 这种类型不在mapping文档里面有点坑。 先直接上例子。 建立 index,把我们要自动补全的字段设置为 completion 类型 或者直接设置为子类型 PUT /blogs_completion/ {"mappings": {"tech": {"properties…...
GB28181协议实现源码Android源码
一、GB28181规范 尽管在国标GB28181中并没有对“平台”进行明确的定义,但在规范中却多次提到“系统平台”、“管理平台”等词汇,在具体项目中、网络上的交流学习中,平台概念也是无处不在。笔者认为,GB28181平台就是视频联网系统中的上级平台、中间平台或下级平台,用于实现…...

HNU工训中心: 三人表决器及八人抢答器实验报告
工训中心的牛马实验 三人表决器: 实验目的 1) 辨识数字IC功能说明。 2) 测试数字集成门电路,掌握输出故障排除、使用注意事项。 3) 掌握逻辑函数搭建三人表决器。 2.实验资源 HBE硬件基础电路实验箱、万用表 74LS00与非门、74LS10 三个3输入与非门…...
split()用法注意事项
split()用法注意事项 这个要注意有些特殊的分割符,比如.,这个表示匹配任何字符,如果在split()中调用的话,会将任何字符都分隔开,比如: String[] split "se.lll".split("."); System…...

centos7配置静态网络常见问题归纳
系列相似配置与安装软件问题整理与归纳文章目录 安装pymysql库_pymysql库安装_张小鱼༒的博客-CSDN博客 解决pip更新的代码_pip更新代码_张小鱼༒的博客-CSDN博客 python当中的第三方wxPython库的安装解答_pip install wx_张小鱼༒的博客-CSDN博客 spark里面配置jdk后的编程…...
产品经理修炼指南【01】
最近看了点产品经理的书,觉得产品经理这个位置和程序员不太一样,程序员唯一考核的标准就是能不能完成工作任务、是否能完成工作代码,但是产品经理貌似不一样,就像我给刘曼说的,产品经理上可以接领导,下可以…...

NCRE计算机等级考试Python真题(十一)
第十一套试题1、以下选项对于import保留字描述错误的是:A.import可以用于导入函数库或者库中的函数B.可以使用from jieba import lcut 引入 jieba库C.使用import jieba as jb,引入函数库jieba,取别名jbD.使用import jieba 引入jieba库正确答案…...

cglib代理解析
工作原理 使用 <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>对类和接口分别进行代理 DemoService package com.fanqiechaodan.user.service;/*** author fa…...

GFD563A101 3BHE046836R0101
GFD563A101 3BHE046836R0101关于高端涂布机张力控制系统方案的介绍高端涂布机张力控制系统方案涂布机是将具有某种功效的胶,或者油墨类物质均匀粘连在塑料薄膜、铝箔、纺织品等表面的机械设备。本系统从放卷到收卷共采用七台变频器,其中收放卷采用闭环张…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...

边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...

【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...