如何将Java赋值表达式转换为Kotlin
类似java的东西如何将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
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) { ...