Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 科特林:为什么可以';我不能在循环守卫中执行任务吗?_Java_Kotlin - Fatal编程技术网

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)

为什么这个语法无效?IntelliJ报告的错误是在这种上下文中只允许表达式(第2行)。我想知道是否有一些语法可以用来解决这个问题,因为Java允许这种类型的循环赋值特性

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) }