如何将Java赋值表达式转换为Kotlin

K.K*_*ong 30 java kotlin

像java这样的东西

int a = 1, b = 2, c = 1;
if ((a = b) !=c){
    System.out.print(true);
}
Run Code Online (Sandbox Code Playgroud)

现在它应该转换为kotlin之类的

var a:Int? = 1
var b:Int? = 2
var c:Int? = 1
if ( (a = b) != c)
    print(true)
Run Code Online (Sandbox Code Playgroud)

但这不正确.

这是我得到的错误:

in " (a=b)" Error:(99, 9) Kotlin: Assignments are not expressions, and only expressions are allowed in this context
Run Code Online (Sandbox Code Playgroud)

实际上,上面的代码只是澄清问题的一个例子.这是我的原始代码:

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) { } 
}
Run Code Online (Sandbox Code Playgroud)

hot*_*key 31

正如@AndroidEx正确指出的那样,与Java不同,赋值不是Kotlin中的表达式.原因是通常不鼓励具有副作用的表达.见这个讨论上类似的话题.

一种解决方案是分割表达式并将赋值移出条件块:

a = b
if (a != c) { ... }
Run Code Online (Sandbox Code Playgroud)

另一个是使用stdlib like中的函数let,它使用receiver作为参数执行lambda并返回lambda结果.applyrun有类似的语义.

if (b.let { a = it; it != c }) { ... }
Run Code Online (Sandbox Code Playgroud)

if (run { a = b; b != c }) { ... }
Run Code Online (Sandbox Code Playgroud)

由于内联,这将与从lambda获取的普通代码一样高效.


你的例子InputStream看起来像

while (input.read(bytes).let { tmp = it; it != -1 }) { ... }
Run Code Online (Sandbox Code Playgroud)

另外,考虑从readBytesa读取a的功能.ByteArrayInputStream


And*_*dEx 12

作业不是 Kotlin中的表达式,因此您需要在外部执行:

var a: Int? = 1
var b: Int? = 2
var c: Int? = 1

a = b
if (a != c)
    print(true)
Run Code Online (Sandbox Code Playgroud)

对于你的另一个例子InputStream你可以这样做:

fun readFile(path: String) {
    val input: InputStream = FileInputStream(path)
    input.reader().forEachLine {
        print(it)
    }
}
Run Code Online (Sandbox Code Playgroud)


w.b*_*ian 11

正如这里的每个人都指出的那样,作业不是Kotlin中的表达.但是,我们可以使用函数文字将赋值强制转换为表达式:

val reader = Files.newBufferedReader(path)
var line: String? = null
while ({ line = reader.readLine(); line }() != null) {
    println(line);
}
Run Code Online (Sandbox Code Playgroud)


Mir*_*ili 10

Java的(a = b) != c

科特林b.also { a = it } != c


围绕OP的问题:

公认的答案不同,我建议使用Kotlin also函数,而不是let

while (input.read(bytes).also { tmp = it } != -1) { ...
Run Code Online (Sandbox Code Playgroud)

因为T.alsoreturn Tit)本身可以与进行比较-1。这更类似于Java的语句分配


有关详细信息,请参见此有用的博客上的“返回此类型与其他类型”