Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kotlin: succinct way of inverting Int sign depending on Boolean value

Tags:

kotlin

I have

var x: Int
var invert: Boolean

and I need the value of the expression

if (invert) -x else x

Is there any more succinct way to write that expression in Kotlin?

like image 466
user2452723 Avatar asked Oct 21 '25 11:10

user2452723


2 Answers

There is no shorter expression using only the stdlib to my knowledge.

This is pretty clear, though. Using custom functions to make it shorter is possible, but it would only obscure the meaning IMO.

like image 186
Joffrey Avatar answered Oct 23 '25 06:10

Joffrey


It's hard to tell which approach might be best without seeing more of the code, but one option is an extension function. For example:

fun Int.negateIf(condition: Boolean) = if (condition) -this else this

(I'm using the term ‘negate’ here, as that's less ambiguous: when dealing with numbers, I think ‘inverse’ more often refers to a multiplicative inverse, i.e. reciprocal.)

You could then use:

x.negateIf(invert)

I think that makes the meaning very clear, and saves a few characters. (The saving is greater if x is a long name or an expression, of course.)


If invert didn't change (e.g. if it were a val), another option would be to derive a multiplier from it, e.g.:

val multiplier = if (invert) -1 else 1

Then you could simply multiply by that:

x * multiplier

That's even shorter, though a little less clear; if you did that, it would be worth adding a comment to explain it.


(BTW, whichever approach you use, there's an extremely rare corner case here: no positive Int has the same magnitude as Int.MIN_VALUE (-2147483648), so you can't negate that one value. Either way, you'll get that same number back. There's no easy way around that, but it's worth being aware of.)

like image 23
gidds Avatar answered Oct 23 '25 07:10

gidds



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!