Java 科特林:为什么可以';我不能在循环守卫中执行任务吗?
为什么这个语法无效?IntelliJ报告的错误是在这种上下文中只允许表达式(第2行)。我想知道是否有一些语法可以用来解决这个问题,因为Java允许这种类型的循环赋值特性Java 科特林:为什么可以';我不能在循环守卫中执行任务吗?,java,kotlin,Java,Kotlin,为什么这个语法无效?IntelliJ报告的错误是在这种上下文中只允许表达式(第2行)。我想知道是否有一些语法可以用来解决这个问题,因为Java允许这种类型的循环赋值特性 var c: Int; while ((c = reader.read()) != 1) { } 语法无效,因为c=reader.read()不是Kotlin中的表达式–这可以防止所有=与=错误 您必须将其改写为: while (true) { val c = reader.read() if (c == 1)
var c: Int;
while ((c = reader.read()) != 1) {
}
语法无效,因为
c=reader.read()
不是Kotlin中的表达式–这可以防止所有=
与=
错误
您必须将其改写为:
while (true) {
val c = reader.read()
if (c == 1) break
...
}
注意:另一个答案解释了语法问题,这里是使用while
循环的替代方法
科特林的一个伟大之处在于,你可以改变你自己的世界,让它成为你想要的样子。让我们创建一个扩展函数来完成其他答案中的基本功能,但要使它更具吸引力
使用此扩展功能:
inline fun Reader.readWhile(crossinline predicate: (Int) -> Boolean): Sequence<Char> {
return generateSequence {
val c = this.read()
if (c != -1 && predicate(c)) {
c.toChar()
} else {
null
}
}
}
@Test fun testSo32596261() {
val reader = CharArrayReader(charArrayOf('A', 'B', 'C', 1.toChar(), 'D', 'E', 'F'))
reader.use {
assertEquals(listOf('A', 'B', 'C'), reader.readWhile { it != 1 }.toList())
}
}
如果要自动关闭读卡器:
reader.use {
reader.readWhile { it != 1 }.forEach {
// do something with each char
}
}
当然,您可以根据需要决定序列是Char
还是Int
。您可以创建自己的useChars
或forEachChar
或任何使代码成为您想要的样子的东西。查看其他扩展的示例,了解想法
单元测试
扩展功能的单元测试:
inline fun Reader.readWhile(crossinline predicate: (Int) -> Boolean): Sequence<Char> {
return generateSequence {
val c = this.read()
if (c != -1 && predicate(c)) {
c.toChar()
} else {
null
}
}
}
@Test fun testSo32596261() {
val reader = CharArrayReader(charArrayOf('A', 'B', 'C', 1.toChar(), 'D', 'E', 'F'))
reader.use {
assertEquals(listOf('A', 'B', 'C'), reader.readWhile { it != 1 }.toList())
}
}
你可以用这样的东西
在kotlin中,有更干净的方式与Reader一起工作-
读卡器的类型是什么?
?可以从流和读卡器中读取库实用程序。无需手动执行。您可以像Kotlin stdlib那样编写扩展函数,从而避免while(true)
@Jire。我在另一个答案中贴了一个这样做的例子。
val writer = StringWriter()
val reader = BufferedReader(InputStreamReader(stream, "UTF-8"))
reader.forEachLine { writer.write(it) }