首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

第11章 运算符重载与约定第11章 运算符重载与约定

第11章 运算符重载与约定 我们《第2章 Kotlin 语法基础》中已经学习过关于运算符相关内容,本章继续深入探讨Kotlin运算符重载与约定。...毋庸置疑Kotlin简洁优雅而且强大实用语法和各种各样语法糖可以大大地提升程序员们生产力。这是都是直接使用 Java 享受不到特性。...我们可以看出,Kotlin 通过更高层次封装,大大简化了BigDecimal 数据类型算术运算代码,使得BigDecimal 算术运算代码更加简单易读。...而在Java中,我们不得不实用冗长方法名进行调用。虽然Kotlin背后调用仍然是Java方法,但是对于Kotlin程序员来说,无疑是更加简洁明了了。...需要注意是,a == b表达式中就算 a、 b 是null,也可以安全调用。因为 a==b 会被Kotlin编译器翻译成带可空性判断 equals() 方法调用: a?.equals(b) ?

91240
您找到你想要的搜索结果了吗?
是的
没有找到

Kotlin|这些隐藏内存陷阱,你应该熟记于心

介于此,本篇根据个人开发经验,聊一聊 Kotlin 中那些隐藏内存陷阱,也希望每一个同学都能在 性能 与 优雅 之间找到合适平衡。...不是说内联可以提高性能,那么不应该任何方法都应该加 inline 提高性能?(就是这么倔强) 上面我们提到了,内联是会将代码移动到调用处,降低 一层栈帧,但这个性能提升真的大?...后者以 apply 作为返回值,代码可读性非常好,相比前者, kotlin 中其显得非常优雅。 但如果我们去看一眼字节码呢?...其可以改善我们 kotlin 语义下编程体验,但同时也不是任何场景都需要其。...如果你方法中需要对某个对象操作多次,比如调用其方法或者属性,那么此时可以使用 apply ,反之,如果次数过少,其实你并不需要 apply 优雅

75730

财务精度:BigInteger 与 BigDecimal

具体原因大家可以移步至: 浮点数精确度探究_ChinaRainbowSea博客-CSDN博客, 你真的了解C语言 if - else 、bool(布尔值)、浮点数损失 ?...常用构造器两个public BigDecimal(double val); // double 转换为 BigDecimal,后者是 double 二进制浮点值准确十进制表示形式。...public BigDecimal(String val); // BigDecimal 字符串表示形式转换为 BigDecimal举例:import java.math.BigDecimal;...:四舍五入时取舍规则,什么情况取,什么情况舍 。...无论是 : BigDecimal  还是 BigInteger 都是引用类型,不是基本数据类型,对于 ”加减乘除“ 运算符,都不可以直接运算,而是通过 对于方法进行了。”

75530

T::class 和 this::class 区别

类继承例子 我们先看个例子: open class Person(val name: String, val age: Int) class Coder(val language: String,...有人可能会说你这不是搞事情,明明 person 这个变量类型就是 Coder,干嘛非要用 Person 类型呢?这问题我想不需要回答吧。 2....我们定协议时要求类型 T 有默认构造方法,以便于我们通过反射实例化它。 我们知道 Kotlin 泛型也是伪泛型,T 在这里不能直接用于获取其具体类型,如果我们想要初始化 t,该怎么做呢?...(new BigDecimal(31000000)) Groovy 是动态类型语言,在运行时根据对象类型确定调用方法,这一点与 Kotlin 不一样: Got raise: 31 Got big...注:本例来自 《Groovy 程序设计》3.6 多方法 一节讨论。 4.

1.2K30

基础篇:JAVA基本类型

因为java产生对象,一般是需堆创建维护,再通过栈引用来使用,但是对于简单变量,需要在堆创建再使用不方便 为什么会有包装类 包装类基本类型包装起来,使其具有对象性质,可以添加属性和方法,丰富基本类型操作...浮点型数据自动提升 floatdouble存在精误差问题,double如果强制float则存在精度丢失问题 ? 7:short s1 = 1; s1 = s1 + 1;有错?...+= 1 -> s1 = (short) s1+ 1; 编译不会报错 8:不同基本类型强制转换,可能会产生什么问题 浮点型整型,精度丢失、数据溢出 取值范围大整型取值范围小整型,数据溢出...那么是否可以把十进制小数扩大N倍化为整数维度来计算,并保留其精度位数,这就是BigDecimal BigDecimal是基于BigInteger来处理计算,BigInteger内部有一个int[] mag...尽量使用字符串来创建BigDecimal,或者使用valueOf方法 BigDecimal data= new BigDecimal(0.1); System.out.println("data:" +

1.2K20

你绝对想不到 Kotlin 泛型给反射留下了怎样坑!

, val age: Int) 它 description 方法返回值应该是这样: age: 30;name: Benny 这个东西很通用,于是我们决定用扩展方法加反射方式来输出,于是: inline...val person: Any = Person("Benny", 30) 对于这样情况,person::class 如果返回是 KClass,那么在后续反射访问属性操作中,我们什么都得不到...3.2 Java 反射方案 Kotlin 反射不能用?不用还不行了么,打不起还躲不起什么世道。。...我当时就惊呆了,还以为这两种获取 KClass 方式有什么重大差别呢,结果跟了下源码,是的,this::class 这种写法调试时候也是可以强制跳入调用栈(反编译看字节码也可以),二位居然都是调用了下面的方法来获取...类型, Kotlin 调用处做了一次类型强,一个强转成了 KClass,一个强转成了 KClass 。。。

8.2K21

Kotlin 1.2 新增特性

自:开源中国 www.oschina.net/translate/whats-new-in-kotlin-12 多平台项目 (实验性) 多平台项目是 Kotlin 1.2 中一个新实验性功能,允许你...如果调用一个返回类型参数 T 并将返回值转换为特定类型 Foo 泛型方法,则编译器现在可以理解此调用 T 需要绑定到 Foo 类型。...用于从位表示形式中转换为浮点数 Regex 类现在是可序列化 kotlin.text.Regex 类已成为可序列化类,现在可以可序列化层次结构中使用。...这可能会影响应用程序整体性能;仅在多个类之间共享一些复杂状态并在类初始化时更新时才使用它。 “手工”解决方法控制流子表达式值存储变量中,而不是直接在调用参数中对它们进行求值。...Java 默认方法调用 Kotlin 1.2 之前,接口成员使用 JVM 1.6 情况下重写 Java 默认方法会在父调用中产生警告:Super calls to Java default methods

2.8K70

绝对干货 | Kotlin内联类工作原理及使用案例,看完你会回来谢我

这正是Kotlin中内联类一大卖点:内联类时,除非绝对必要,否则类本身不会在字节码中使用。内联类大大减少了运行时空间开销。 运行时 在运行时,可以内联类表示为包装类型和基础类型。...) 为了使这两种take方法JVM字节码中可用并避免签名冲突,编译器第一个方法重命名为take-hqTGqkw之类东西。...注意,上面的示例确实显示了“ _”而不是“-”,因为Java不允许方法名称包含破折号,这也是为什么不能从Java调用接受内联类方法原因。...内联类装箱 前面我们看到过,box_impl和unbox_impl函数是为内联类创建,那么什么时候需要它们?Kotlin文档引用了一条经验法则: 内联类在用作其他类型时会被装箱。...这些方法虽然显然会分配额外空间,但仍然是有效特殊情况下应避免使用。内联类可以帮助您。我们已经注意到,内联类不能具有带有幕后字段多个属性。但是,它们可以具有属性和函数形式简单计算成员。

1.3K30

带你认识Hutool工具包

简介 Hutool 是一个小而全 Java 工具类库,通过静态方法封装,降低相关 API 学习成本,提高工作效率,使 Java 拥有函数式语言般优雅,让 Java 语言也可以 “甜甜”。...,它节省了开发人员对项目中公用类和公用工具方法封装时间,使开发专注于业务,同时可以最大限度避免封装不完善带来 bug。...hutool-all 以便使用所有工具类功能 引入 hutool-xxx 单独模块使用 # import 方式 如果你想像 Spring-Boot 一样引入 Hutool,再由子模块决定用到哪些模块,你可以父模块中加入...import 子模块中就可以引入自己需要模块了...数字工具 - NumberUtil //封装BigDecimal方法来保留小数 double te1=123456.123456; double te2=123456.128456; Console.log

52430

【刨根问底】BigDecimal 案例和部分源码分析

但是如果涉及到数据类型处理等就不是很好做,于是这会Bigdecimal就出现了。 ? BigDecimal定义 不变,任意精度带符号十进制数字。...} 看得出来,这里没做什么,然后直接调用了重载构造方法: public BigDecimal(char[] in, int offset, int len) { //MathContext.UNLIMITED...这个老版本中有使用,新版本没有使用了 this(in,offset,len,MathContext.UNLIMITED); } 继续调用重载方法: /** * BigDecimal...字符数组表示形式转换为 BigDecimal,接受与 * BigDecimal(String) 构造方法相同字符序列,同时允许指定子数组。...* 注意,如果字符数组中已经提供字符序列,则使用此构造方法要比 * char 数组转换为字符串并使用 BigDecimal(String) 构造方法更快。

1.1K20

Kotlin 程序设计》第九章 Kotlin与Java混合调用

1 使用工具互相转换 1.1 Java 转换为 Kotlin 如果你之前使用 Java 语言而没有 Kotlin 开发经验,不用担心,Intellij IDEA 会帮你一键转换, Java 代码转换成...1.2 Kotlin换为 Java 另外,通过IDEAKotlin插件,可以直接把Kotlin代码ByteCode反编译成Java代码(虽然这个反编译后Java代码不是那么原汁原味)。...例如 // Java 代码中有方法叫 is() public void is(){ //... } // 转换为 Kotlin 代码需要加反引号转义 fun `is`() { //... } 4...当然,扩展并不能真正修改它所扩展类。通过定义一个扩展,我们并没有一个类中插入新方法,仅仅是可以通过该类型变量用点表达式来调用这个新函数。...至于为什么这么说呢,我见过一句话很形象:摊开来代码,比叠起来代码,更加一目了然。详细可以自行阅读《Effective Java》。 Kotlin默认类是final类型,即每个类默认不可继承。

1.5K50

11.3 Java 数值类使用

BigInteger 构造方法有很多,其中字符串参数构造方法有两个: BigInteger(String val):十进制字符串val转换为 BigInteger 对象。...BigInteger 提供多种方法,下面列举几个常用方法int compareTo(BigInteger val):当前对象与参数 val 进行比较,方法返回值是 int,如果返回值是 0,则相等...BigDecimal构造方法有很多: BigDecimal(BigInteger val): BigInteger 对象 val 转换为BigDecimal对象。...BigDecimal(int val):int换为 BigDecimal 对象。 BigDecimal(long val):long转换为 BigDecimal 对象。...BigDecimal 提供多种方法,下面列举几个常用方法int compareTo(BigDecimal val):当前对象与参数 val 进行比较,方法返回值是int,如果返回值是0,则相等;

93110

绝对干货 | Kotlin内联类工作原理及使用案例,看完你会回来谢我

这正是Kotlin中内联类一大卖点:内联类时,除非绝对必要,否则类本身不会在字节码中使用。内联类大大减少了运行时空间开销。 运行时 在运行时,可以内联类表示为包装类型和基础类型。...) 为了使这两种take方法JVM字节码中可用并避免签名冲突,编译器第一个方法重命名为take-hqTGqkw之类东西。...注意,上面的示例确实显示了“ _”而不是“-”,因为Java不允许方法名称包含破折号,这也是为什么不能从Java调用接受内联类方法原因。...内联类装箱 前面我们看到过,box_impl和unbox_impl函数是为内联类创建,那么什么时候需要它们?Kotlin文档引用了一条经验法则: 内联类在用作其他类型时会被装箱。...这些方法虽然显然会分配额外空间,但仍然是有效特殊情况下应避免使用。内联类可以帮助您。我们已经注意到,内联类不能具有带有幕后字段多个属性。但是,它们可以具有属性和函数形式简单计算成员。

55620

一篇文章讲明白double、float丢失精度问题

问题 计算机是通过二进制计算,如果我们二进制视角来看待上面问题,就很容易发现问题了。 例如:把「0.1」转成二进制表示,然后还原成十进制,就能看出问题。...1.1+0.1 = 1.2000000000000002 5.解决方案 针对浮点数丢失精度问题,我们可以通过BigDecimal来解决 new BigDecimal(double val) 该方法是不可预测...,以0.1为例,你以为你传了一个double类型0.1,最后会返回一个值为0.1BigDecimal?...官方其实提供给你思路并且实现了它,可以使用Double.toString(double val)先将double值转为String,再调用第二种构造方式,你可以直接使用静态方法:valueOf(double...总结:double转为BigDecimal时候,需要先把double转换为字符串,然后再作为BigDecimal(String val)构造函数参数,这样才能避免出现精度问题。

63530

4. Groovy语法-Number和Boolean数据类型学习

Float对象 def d =12.3d //创建是一个Double对象 def g= 12.3g //创建是一个BigDecimal对象 2.3 下划线数值 这个特性就和Kotlin数值一样,...2.4 数值类型后缀 创建浮点数时我使用了f,g,d等后缀添加在数值后面。这是为了告诉系统该参数属于什么数据类型。除了这三个以外。...BigInteger和BigDecimal一起工作,这与Java中必须使用显式方法对这些数字进行操作不同。...如果除法是精确(即产生结果可以相同精度和刻度范围内表示),则使用divide()方法执行BigDecimal除法,或者使用MathContext,其精度为两个操作数最大值加上额外10精度,...但是更复杂布尔表达式可以用逻辑运算符表示。 此外,Groovy还有一些特殊规则(通常称为Groovy Truth),用于非布尔对象强制转换为布尔值。 布尔型变量,本身比较简单。 4.

74210

《Kotin 编程思想·实战》

a:b Kotlin: val max = if (a>b) a else b if语句块最后可以自动返回最后一行表达式值,而不需要写return fun ifExample(x: Int, y:...protected:类似于private,但对子类也可见 5.2.2 关键保留字 var:定义变量 val:定义常量 fun:定义方法 Unit:默认方法返回值,类似于Java中void,可以理解成返回没什么值...目的 接口默认方法主要目标之一是解决接口演化问题。当往一个接口中添加新方法时,可以提供该方法默认实现。对于已有的接口使用者来说,代码可以继续运行。...新代码则可以使用该方法,也可以覆写默认实现。...与Java互操作(Interoperability) 9.1 使用工具互相转换 9.1.1 Java 转换为 Kotlin 9.1.2 Kotlin换为 Java 9.1.3 用 Kotlin

1.3K30

(四)改掉这些坏习惯,还怕写不出健壮代码?

Code Review 是一场苦涩但有意思修行。 (一)改掉这些坏习惯,还怕写不出健壮代码? (二)改掉这些坏习惯,还怕写不出优雅代码? (三)改掉这些坏习惯,还怕写不出优雅代码?...看似很顺眼,但是你细品,就会发现其中之奥秘,下面一起本地跑跑代码,来分析一下到底会存在什么问题?...禁止使用构造方法 BigDecimal(double)方式把 double 值转化为 BigDecimal 对象。...BigDecimal(double)存在精度损失风险,精确计算或值比较场景中可能会导致业务逻辑异常。...如:BigDecimal g = new BigDecimal(0.1f); 实际存储值为:0.10000000149 优先推荐入参为 String 构造方法,或使用 BigDecimal valueOf

41630

Kotlin | 浅谈 Reified 与泛型 三两事

Kotlin 中存在名为 reified 关键字,它可以被作用于函数上, 以此做到类型擦除后再生,便于开发者优雅使用泛型以及获取方法泛型类型。...inline 关键字是什么呢? 简单理解为:当一个函数被标记为 inline 时,kotlin编译器 会在所有调用这个函数位置,方法函数替换为具体函数体。...方法中调用toAct(),不难发现,toAct()逻辑已经被移动到了 test() 中,而我们泛型类型也被替换为实际使用类型,从而我们可以方法函数中直接获取相应泛型类型。...因为 Java 并没有内联特性,我们使用 inline 方法 Java 中会被当做普通方法,而 reified 正是需要内联才可以保证泛型再生,所以自然无法调用。...但相应,该关键字修饰方法或者字段Java中却依然可以被调用,甚是让java调用者费解与不优雅。所以相应,对于方法,我们可以增加 @JvmSynthetic ,从而避免java代码编译期调用。

43420

优雅避坑】你钱算错了!为什么0.1+0.2不等于0.3了!?

计算机内部是用位来存储和处理数据。用一个二进制串表示数据,十进制转换成二进制,二进制转换成十进制方法是: 十进制二进制:除2取余 二进制十进制:乘2取整 那么,十进制0.1成二进制: ?...为什么说大部分十进制小数呢,因为像0.5这样分母是2倍数十进制数是没有舍入误差,计算机能够用二进制精确表示。...,因此: 优先推荐入参为 String 构造方法,或使用 BigDecimal valueOf 方法,此方法内部其实执行了 Double toString,而 Double toString...说明:BigDecimal(double)存在精度损失风险,精确计算或值比较场景中可能会导致业务逻辑异常。...推荐阅读 【优雅避坑】不要轻易使用==比较两个Integer值 【优雅避坑】从验证码生成代码优化到JVM栈和堆 Java最强大技术之一:反射 点点 在看 行不行 ?

47420
领券