* * 不能 * 因为int整型中有一半是负数,也就是说 * i 为负数,那么返回值永远为false */ public static boolean isOdd(...int i){ return i % 2 == 1; } /** * 这个方法能够很好的运转, * 因为不管对正数和负数来说,余数为0 -- 偶数 *...= 0; } /** * 使用位操作符 来替代取余操作符,能够改善性能 * note: * 5转换为二进制:0000 0000 0000 0000 0000 0000...* 下面的程序将打印什么?...* 第一个输出语句将打印 Ha * 第二个输出语句打印 169 * 为什么会这样呢?
第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) ?
介于此,本篇将根据个人开发经验,聊一聊 Kotlin 中那些隐藏的内存陷阱,也希望每一个同学都能在 性能 与 优雅 之间找到合适的平衡。...不是说内联可以提高性能吗,那么不应该任何方法都应该加 inline 提高性能吗?(就是这么倔强) 上面我们提到了,内联是会将代码移动到调用处,降低 一层栈帧,但这个性能提升真的大吗?...后者以 apply 作为返回值,代码可读性非常好,相比前者,在 kotlin 中其显得非常优雅。 但如果我们去看一眼字节码呢?...其可以改善我们在 kotlin 语义下的编程体验,但同时也不是任何场景都需要其。...如果你的方法中需要对某个对象操作多次,比如调用其方法或者属性,那么此时可以使用 apply ,反之,如果次数过少,其实你并不需要 apply 的优雅。
具体原因大家可以移步至: 浮点数的精确度的探究_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 都是引用类型,不是基本数据类型,对于 ”加减乘除“ 运算符,都不可以直接运算,而是通过 对于的方法进行了。”
类继承的例子 我们先看个例子: 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.
因为java产生对象,一般是需在堆创建维护,再通过栈的引用来使用,但是对于简单的小的变量,需要在堆创建再使用不方便 为什么会有包装类 包装类将基本类型包装起来,使其具有对象的性质,可以添加属性和方法,丰富基本类型的操作...浮点型数据的自动提升 float转double存在精误差问题,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:" +
, 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 。。。
转自:开源中国 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
这正是Kotlin中内联类的一大卖点:内联类时,除非绝对必要,否则类本身不会在字节码中使用。内联类大大减少了运行时的空间开销。 运行时 在运行时,可以将内联类表示为包装类型和基础类型。...) 为了使这两种take方法在JVM字节码中可用并避免签名冲突,编译器将第一个方法重命名为take-hqTGqkw之类的东西。...注意,上面的示例确实显示了“ _”而不是“-”,因为Java不允许方法名称包含破折号,这也是为什么不能从Java调用接受内联类的方法的原因。...内联类的装箱 前面我们看到过,box_impl和unbox_impl函数是为内联类创建的,那么什么时候需要它们?Kotlin的文档引用了一条经验法则: 内联类在用作其他类型时会被装箱。...这些方法虽然显然会分配额外的空间,但仍然是有效的,在特殊情况下应避免使用。内联类可以帮助您。我们已经注意到,内联类不能具有带有幕后字段的多个属性。但是,它们可以具有属性和函数形式的简单计算成员。
简介 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
但是如果涉及到数据类型转后在处理等就不是很好做,于是这会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 使用工具互相转换 1.1 将 Java 转换为 Kotlin 如果你之前使用 Java 语言而没有 Kotlin 开发经验,不用担心,Intellij IDEA 会帮你一键转换,将 Java 代码转换成...1.2 将 Kotlin 转换为 Java 另外,通过IDEA的Kotlin插件,可以直接把Kotlin代码ByteCode反编译成Java代码(虽然这个反编译后的Java代码不是那么的的原汁原味)。...例如 // Java 代码中有个方法叫 is() public void is(){ //... } // 转换为 Kotlin 代码需要加反引号转义 fun `is`() { //... } 4...当然,扩展并不能真正的修改它所扩展的类。通过定义一个扩展,我们并没有在一个类中插入新的方法,仅仅是可以通过该类型的变量用点表达式来调用这个新函数。...至于为什么这么说呢,我见过一句话很形象:摊开来的代码,比叠起来的代码,更加一目了然。详细可以自行阅读《Effective Java》。 Kotlin默认类是final类型的,即每个类默认不可继承。
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,则相等;
问题 计算机是通过二进制计算的,如果我们在二进制的视角来看待上面问题,就很容易发现问题了。 例如:把「0.1」转成二进制的表示,然后还原成十进制,就能看出问题。...1.1+0.1 = 1.2000000000000002 5.解决方案 针对浮点数丢失精度的问题,我们可以通过BigDecimal来解决 new BigDecimal(double val) 该方法是不可预测的...,以0.1为例,你以为你传了一个double类型的0.1,最后会返回一个值为0.1的BigDecimal吗?...官方其实提供给你思路并且实现了它,可以使用Double.toString(double val)先将double值转为String,再调用第二种构造方式,你可以直接使用静态方法:valueOf(double...总结:将double转为BigDecimal的时候,需要先把double转换为字符串,然后再作为BigDecimal(String val)构造函数的参数,这样才能避免出现精度问题。
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.
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
Code Review 是一场苦涩但有意思的修行。 (一)改掉这些坏习惯,还怕写不出健壮的代码? (二)改掉这些坏习惯,还怕写不出优雅的代码? (三)改掉这些坏习惯,还怕写不出优雅的代码?...看似很顺眼,但是你细品,就会发现其中之奥秘,下面一起在本地跑跑代码,来分析一下到底会存在什么问题?...禁止使用构造方法 BigDecimal(double)的方式把 double 值转化为 BigDecimal 对象。...BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。...如:BigDecimal g = new BigDecimal(0.1f); 实际的存储值为:0.10000000149 优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf
计算机内部是用位来存储和处理数据的。用一个二进制串表示数据,十进制转换成二进制,二进制转换成十进制的方法是: 十进制转二进制:除2取余 二进制转十进制:乘2取整 那么,十进制的0.1转成二进制: ?...为什么说大部分的十进制小数呢,因为像0.5这样分母是2的倍数的十进制数是没有舍入误差的,计算机能够用二进制精确表示。...,因此: 优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了 Double 的 toString,而 Double 的 toString...说明:BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。...推荐阅读 【优雅的避坑】不要轻易使用==比较两个Integer的值 【优雅的避坑】从验证码生成代码的优化到JVM栈和堆 Java最强大的技术之一:反射 点点 在看 行不行 ?
Kotlin 中存在名为 reified 的关键字,它可以被作用于函数上, 以此做到类型擦除后的再生,便于开发者优雅的使用泛型以及获取方法的泛型类型。...inline 关键字是什么呢? 简单理解为:当一个函数被标记为 inline 时,kotlin编译器 会在所有调用这个函数的位置,将方法函数替换为具体的函数体。...方法中调用toAct(),不难发现,toAct()的逻辑已经被移动到了 test() 中,而我们的泛型类型也被替换为实际使用的类型,从而我们可以在方法函数中直接获取相应的泛型类型。...因为 Java 并没有内联的特性,我们使用的 inline 方法在 Java 中会被当做普通方法,而 reified 正是需要内联才可以保证泛型再生,所以自然无法调用。...但相应的,该关键字修饰的方法或者字段在Java中却依然可以被调用,甚是让java调用者费解与不优雅。所以相应的,对于方法,我们可以增加 @JvmSynthetic ,从而避免java代码编译期调用。
领取专属 10元无门槛券
手把手带您无忧上云