Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Java赋值表达式转换为Kotlin_Java_Kotlin - Fatal编程技术网

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

如何将Java赋值表达式转换为Kotlin,java,kotlin,Java,Kotlin,类似java的东西 int a = 1, b = 2, c = 1; if ((a = b) !=c){ System.out.print(true); } 现在它应该像kotlin一样转换成kotlin var a:Int? = 1 var b:Int? = 2 var c:Int? = 1 if ( (a = b) != c) print(true) 但这是不正确的 以下是我得到的错误: in " (a=b)" Error:(99, 9) Kotlin: Assignme

类似java的东西

int a = 1, b = 2, c = 1;
if ((a = b) !=c){
    System.out.print(true);
}
现在它应该像kotlin一样转换成kotlin

var a:Int? = 1
var b:Int? = 2
var c:Int? = 1
if ( (a = b) != c)
    print(true)
但这是不正确的

以下是我得到的错误:

in " (a=b)" Error:(99, 9) Kotlin: Assignments are not expressions, and only expressions are allowed in this context
实际上,上面的代码只是澄清问题的一个示例。这是我的原始代码:

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) { } 
}
在Kotlin完成作业,因此您需要在外部完成:

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

a = b
if (a != c)
    print(true)
对于另一个使用
InputStream
的示例,您可以执行以下操作:

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

正如@AndroidEx正确指出的那样,与Java不同,赋值在Kotlin中不是表达式。原因是通常不鼓励使用有副作用的表达。关于类似的主题,请参见

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

a = b
if (a != c) { ... }
另一种方法是使用类似stdlib的函数,它以接收方为参数执行lambda并返回lambda结果<代码>应用和
运行
具有相似的语义

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

多亏了,这将与从lambda获取的普通代码一样高效


使用
InputStream
的示例如下所示

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

也可以考虑从<代码>输入流

> P>中读取函数<代码> ByteArray <代码>,这里几乎每个人都指出,赋值不是Kotlin中的表达式。但是,我们可以使用函数文字将赋值强制为表达式:

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

我想这可能会帮助你:

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

kotlin的简单方法是

if (kotlin.run{ a=b; a != c}){ ... }
Java:
(a=b)!=c
科特林:
b.也{a=it}=c

与不同,我建议使用Kotlin的
功能,而不是
let

while (input.read(bytes).also { tmp = it } != -1) { ...
因为
T.也
返回
T
it
)本身,然后您可以将其与
-1
进行比较。这更类似于Java作为表达式的赋值



有关详细信息,请参阅上的“返回此类型与其他类型的比较”部分。

您遇到了什么错误?在“(a=b)”中错误:(99,9)Kotlin:赋值不是表达式,在这个上下文中只允许表达式我尝试使用i/o流,所以我必须在if()或while()中放入a=b,我该如何处理,这是我的原始代码
fun readFile(path:String):Unit{var-input:InputStream=FileInputStream(path)var-String:String=”“var-tmp:Int=-1var-bytes:ByteArray=ByteArray(1024),而((tmp=input.read(bytes))!=-1{}
注意:
读卡器
forEachLine
并不完全适用于任意字节流的所有情况,至少不适用于默认(因此未定义)编码,该编码可能不是单字节编码,并且在解码字节时可能会失败<代码>InputStream::readBytes
更好。Idea的自动java到kotlin转换也可以做到这一点
while (input.read(bytes).also { tmp = it } != -1) { ...