Something in java like
int a = 1, b = 2, c = 1; if ((a = b) !=c){ System.out.print(true); } now it should be converted to kotlin like
var a:Int? = 1 var b:Int? = 2 var c:Int? = 1 if ( (a = b) != c) print(true) but it's not correct.
Here is the error I get:
in " (a=b)" Error:(99, 9) Kotlin: Assignments are not expressions, and only expressions are allowed in this context Actually the code above is just an example to clarify the problem. Here is my original code:
fun readFile(path: String): Unit { var input: InputStream = FileInputStream(path) var string: String = "" var tmp: Int = -1 var bytes: ByteArray = ByteArray(1024) while((tmp=input.read(bytes))!=-1) { } }
As @AndroidEx correctly stated, assignments are not expressions in Kotlin, unlike Java. The reason is that expressions with side effects are generally discouraged. See this discussion on a similar topic.
One solution is just to split the expression and move the assignment out of condition block:
a = b if (a != c) { ... } Another one is to use functions from stdlib like let, which executes the lambda with the receiver as parameter and returns the lambda result. apply and run have similar semantics.
if (b.let { a = it; it != c }) { ... }
if (run { a = b; b != c }) { ... } Thanks to inlining, this will be as efficient as plain code taken from the lambda.
Your example with InputStream would look like
while (input.read(bytes).let { tmp = it; it != -1 }) { ... } Also, consider readBytes function for reading a ByteArray from an InputStream.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With