Cela fait quelques jours que j'ai commencé à utiliser Kotlin comme passe-temps, et je suis impressionné par le soutien poli des démangeaisons de Java.L'arithmétique BigDecimal en fait partie.
Les opérations numériques sont souvent nécessaires dans les applications professionnelles, mais Double n'est pas utilisable, donc BigDecimal est une option. Et cette opération BigDecimal est extrêmement illisible.
BigDecimalBasicSample.kt
/**
* BigDecimal coding style : (a + b) / 2
*/
fun main(args: Array<String>) {
val a = BigDecimal.ONE
val b = BigDecimal.TEN
// Java style
println(a.add(b).divide(BigDecimal.valueOf(2L), RoundingMode.HALF_EVEN))
// Kotlin basic style
println((a + b) / 2.toBigDecimal())
}
Java est terrible. Kotlin est très facile à lire car il peut appliquer des opérateurs arithmétiques à quatre règles, mais «2.toBigDecimal ()» reste insatisfait.
BigDecimalCustomSample.kt
/** custome operator BigDecimal / Long */
operator fun BigDecimal.div(other : Long) : BigDecimal = this / other.toBigDecimal()
/**
* BigDecimal coding style : (a + b) / 2
*/
fun main(args: Array<String>) {
val a = BigDecimal.ONE
val b = BigDecimal.TEN
// Java style
println(a.add(b).divide(BigDecimal.valueOf(2L), RoundingMode.UP))
// Kotlin custom oeprator style
println((a + b) / 2)
}
En implémentant l'opérateur d'origine «BigDecimal / Long», la lisibilité a été améliorée.
Dans Kotlin, les opérateurs sont équivalents à appeler une méthode donnée. Dans Surcharge des opérateurs, chaque opérateur et son correspondant La méthode à faire est indiquée. Voici un extrait de l'opérateur à quatre règles.
Expression | Translated to |
---|---|
a + b |
a.plus(b) |
a - b |
a.minus(b) |
a * b |
a.times(b) |
a / b |
a.div(b) |
a % b |
a.rem(b) , a.mod(b) (deprecated) |
a..b |
a.rangeTo(b) |
En implémentant des méthodes telles que plus
avec ʻoperator fun`, vous pouvez définir vos propres opérateurs entre des classes arbitraires.
L'implémentation de l'opérateur se trouve dans BigDecimals.kt inclus dans kotlin-stdlib. Il est décrit. Extrait de l'implémentation de la division "/" comme exemple. Vous pouvez voir que BigDecimal # divide
est utilisé et RoundingMode.HALF_EVEN
est utilisé comme argument.
BigDecimals.kt
/**
* Enables the use of the `/` operator for [BigDecimal] instances.
*
* The scale of the result is the same as the scale of `this` (divident), and for rounding the [RoundingMode.HALF_EVEN]
* rounding mode is used.
*/
@kotlin.internal.InlineOnly
public inline operator fun BigDecimal.div(other: BigDecimal): BigDecimal = this.divide(other, RoundingMode.HALF_EVEN)
Recommended Posts