2016-04-27 11 views
17

Etwas in Java wieWie Java Zuweisungsausdruck zu Kotlin

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

jetzt konvertiert es wie

var a:Int? = 1 
var b:Int? = 2 
var c:Int? = 1 
if ((a = b) != c) 
    print(true) 

Kotlin umgewandelt werden soll, aber es ist nicht richtig. Hier

ist der Fehler, den ich bekommen:

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

Eigentlich oberhalb der Code nur ein Beispiel ist, das Problem zu klären. Hier ist meine 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) { } 
} 
+0

Welche Fehler (oder Fehler) werden Sie bekommen? –

+0

in "(a = b)" Fehler: (99, 9) Kotlin: Zuweisungen sind keine Ausdrücke, und nur Ausdrücke sind in diesem Kontext erlaubt –

Antwort

14

Wie @AndroidEx richtig feststellte, sind Zuordnungen im Gegensatz zu Java keine Ausdrücke in Kotlin. Der Grund ist, dass Ausdrücke mit Nebenwirkungen im Allgemeinen nicht erwünscht sind. Ein ähnliches Thema finden Sie unter this discussion.

Eine Lösung ist, einfach den Ausdruck zu spalten und die Zuordnung von Bedingungsblock bewegen:

a = b 
if (a != c) { ... } 

Ein andere Funktionen aus stdlib wie let zu verwenden ist, die das Lambda mit dem Empfänger als Parameter und kehrt ausführen das Lambda-Ergebnis. apply und run haben ähnliche Semantik.

if (b.let { a = it; it != c }) { ... } 

if (run { a = b; b != c }) { ... } 

Dank inlining, wird dies von der Lambda genommen als einfacher Code so effizient sein.


Ihr Beispiel mit InputStream würde aussehen wie

while (input.read(bytes).let { tmp = it; it != -1 }) { ... } 

Bedenken Sie auch readBytes Funktion für eine ByteArray von einem InputStream lesen.

8

Zuordnungen are not expressions in Kotlin, so müssen Sie es draußen tun:

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

a = b 
if (a != c) 
    print(true) 

Für Ihr weiteres Beispiel mit InputStream Sie tun können:

fun readFile(path: String) { 
    val input: InputStream = FileInputStream(path) 
    input.reader().forEachLine { 
     print(it) 
    } 
} 
+0

ich versuche, i/o-Stream zu verwenden, also muss ich * a = b setzen * in ** if() ** oder ** while() **, wie soll ich tun? –

+0

Sorry, hier ist mein ursprünglicher Code 'fun readFile (Pfad: String): Unit { var input: InputStream = FileInputStream (Pfad) var string: String = "" var tmp: Int = -1 var bytes: ByteArray = ByteArray (1024) while ((tmp = input.read (Bytes)) = - 1) { } } ' –

+0

@ K.KSong bearbeitet meine Antwort – AndroidEx

4

Wie so ziemlich jeder hier darauf hingewiesen hat, sind Aufgaben in Kotlin keine Ausdrücke. Aber wir können zwingen die Zuordnung in einem Ausdruck eine Funktionsliteral mit:

val reader = Files.newBufferedReader(path) 
var line: String? = null 
while ({ line = reader.readLine(); line }() != null) { 
    println(line); 
} 
0

ich denke, das Ihnen helfen kann:

input.buffered(1024).reader().forEachLine { 
      fos.bufferedWriter().write(it) 
     }