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

news/2024/4/29 7:08:00/文章来源:https://blog.csdn.net/poorkick/article/details/129288571

操作符 …<

..< 操作符是 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)  // 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

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微服务】Ribbon实现负载均衡

目录 1.什么是负载均衡 2.自定义负载均衡 3.基于Ribbon实现负载均衡 Ribbon⽀持的负载均衡策略 4.负载均衡原理 源码跟踪 LoadBalancerIntercepor LoadBalancerClient 5.负载均衡策略IRule 总结 1.什么是负载均衡 通俗的讲&#xff0c; 负载均衡就是将负载&#xff…

Java奠基】运算符的讲解与使用

目录 运算符与表达式的使用 算术运算符 隐式转换与强制转换 自增自减运算符 赋值运算符 关系运算符 逻辑运算符 三元运算符 运算符与表达式的使用 运算符是指&#xff1a;对字面量或者变量进行操作的符号。 表达式是指&#xff1a;用运算符把字面量或者变量连接起来&…

使用Geth搭建多节点私有链

使用Geth搭建多节点私有链 步骤 1.编辑初始化配置文件genesis.json {"config": {"chainId": 6668,"homesteadBlock": 0,"eip150Block": 0,"eip150Hash": "0x000000000000000000000000000000000000000000000000000000…

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

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

Vue3 企业级项目实战:认识 Spring Boot

Vue3 企业级项目实战 - 程序员十三 - 掘金小册Vue3 Element Plus Spring Boot 企业级项目开发&#xff0c;升职加薪&#xff0c;快人一步。。「Vue3 企业级项目实战」由程序员十三撰写&#xff0c;2744人购买https://s.juejin.cn/ds/S2RkR9F/ 越来越流行的 Spring Boot Spr…

NJ+SCU42做Modbus RTU从站

NJSCU42做Modbus RTU从站实验时间&#xff1a;2023.2.28 硬件设备&#xff1a;NJ501-1300&#xff0c;CJ1W-SCU42 软件&#xff1a;Sysmac Studio&#xff0c;Commix串口调试助手 案例简介&#xff1a;发送Modbus RTU命令读取NJ里的数据 1. 系统概述 264 ​ 本次实验使用C…

回暖!“数”说城市烟火气背后

“人间烟火气&#xff0c;最抚凡人心”。在全国各地政策支持以及企业的积极生产运营下&#xff0c;经济、社会、生活各领域正加速回暖&#xff0c;“烟火气”在城市中升腾&#xff0c;信心和希望正在每个人心中燃起。 发展新阶段&#xff0c;高效统筹经济发展和公共安全&#…

[文件操作] File 类的用法和 InputStream, OutputStream 的用法

能吃是不是件幸福的事呢 文章目录前言1. 文件的相关定义2. 文件类型3. Java对文件系统的操作3.1 对文件的基础操作3.2 读文件3.3 写文件前言 从这章开始,我们就开始学文件操作相关的知识了~ 1. 文件的相关定义 1.文件的定义可以从狭义和广义两个方面解释. 狭义: 指硬盘上的文…

进程、线程、协程详解

目录 前言&#xff1a; 一、进程 进程的概念 进程内存空间 二、线程 线程的定义 内核线程 用户线程 内核线程和用户线程的比较 线程的状态 三、协程 协程的定义 协程序相对于线程优势 运用场景 四、线程、协程、进程切换比较 前言&#xff1a; 有时候无法…

原生JS实现拖拽排序

拖拽&#xff08;这两个字看了几遍已经不认识了&#xff09; 说到拖拽&#xff0c;应用场景不可谓不多。无论是打开电脑还是手机&#xff0c;第一眼望去的界面都是可拖拽的&#xff0c;靠拖拽实现APP或者应用的重新布局&#xff0c;或者拖拽文件进行操作文件。 先看效果图&am…

人力资源管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;在当今的信息化社会&#xff0c;为了更有效率地工作&#xff0c;人们充分利用现在的电子信息技术&#xff0c;在办公室架设起办公服务平台&#xff0c;将人力资源相关信息统一起来管理&#xff0c;帮助管理者有效组织降低成本和加速…

测试2年,当初一起入行的朋友很多月薪20k了,自己却还没过万,到底差在了哪里?

说来奇怪&#xff0c;不管是读书还是工作&#xff0c;都存在一个现象&#xff0c;那就是人比人&#xff0c;比死人。读书的时候&#xff0c;不管是老师还是家长口中&#xff0c;总会有一个“别人家的孩子”。同样&#xff0c;到工作中&#xff0c;领导口中总会有一个“别人的员…

代码随想录算法训练营day46 | 动态规划之背包问题 139.单词拆分

day46139.单词拆分1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp[i]139.单词拆分 题目链接 解题思路&#xff1a;单词就是物品&#xff0c;字符串s就是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把背包装满。…

【微服务】-认识微服务

目录 1.1 单体、分布式、集群 单体 分布式 集群 1.2 系统架构演变 1.2.1 单体应⽤架构 1.2.2 垂直应⽤架构 1.2.3 分布式架构 1.2.4 SOA架构 1.2.5 微服务架构 1.3 微服务架构介绍 微服务架构的常⻅问题 1.4 SpringCloud介绍 1.4.1 SpringBoot和SpringCloud有啥关…

高压放大器知识科普介绍

高压放大器是一种用于放大高压信号的电子设备&#xff0c;具有高压输出&#xff0c;低噪声&#xff0c;高精度&#xff0c;高稳定性&#xff0c;高可靠性&#xff0c;低功耗&#xff0c;低成本等的优点&#xff0c;所以才被广泛应用在磁场探测、电磁脉冲放大、电磁波放大、电磁…

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

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

(Trie Tree)字典树

&#xff08;Trie Tree&#xff09;字典树 场景&#xff1a;在n个字符串中查找某个字符串。 暴力匹配&#xff0c;时间复杂度为O&#xff08;nm&#xff09;&#xff0c;m为字符串平均长度&#xff0c;效率过低。 字典查找单词"fly"&#xff0c;首先查找’f’,然后…

HACKTHEBOX——Teacher

nmapnmap -sV -sC -p- -T4 -oA nmap 10.10.10.153nmap只发现了对外开放了80端口&#xff0c;从http-title看出可能是某个中学的官网http打开网站确实是一个官网&#xff0c;查看每个接口看看有没有可以利用的地方发现了一个接口&#xff0c;/images/5.png&#xff0c;但是响应包…

【计算机二级python】综合题目

计算机二级python真题 文章目录计算机二级python真题题目一&#xff1a;全球大学排名题目二&#xff1a;红楼梦题目一&#xff1a;全球大学排名 在省略号处填写一行或多行代码&#xff0c;完成如下功能‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪…

web,h5海康视频接入监控视频流记录三(后台node取流)

前端vue&#xff0c;接入ws视频播放 云台控制 &#xff0c;回放预览&#xff0c;都是需要调对应的海康接口。相当于&#xff0c;点击时&#xff0c;请求后台写好的接口&#xff0c;接口再去请求海康的接口 调用云台控制是&#xff0c;操作一次&#xff0c;不会自己停止&#x…