Ошибка перевода с Java на Kotlin - PullRequest
0 голосов
/ 22 ноября 2018

Используя последний плагин Kotlin 1.3.10 из последней версии IntelliJ IDEA 2018.3, если я перевожу следующий код Java в Kotlin:

    BufferedReader br = Files.newBufferedReader(Paths.get("filename"));
    String line;
    while ((line = br.readLine()) != null)
        System.out.println(line);

Я получаю это:

    val br = Files.newBufferedReader(Paths.get("filename"))
    var line: String
    while ((line = br.readLine()) != null)
        println(line)

while ((line = br.nextLine()) != null) - идиоматическая Java, но ее автоматический перевод приводит к неправильному синтаксису, потому что назначения в Kotlin не являются выражениями.

  1. Является ли это известной ошибкой в ​​переводчике Java-to-Kotlin?

  2. Какой идиоматический синтаксис Kotlin эквивалентен приведенному выше коду Java?

1 Ответ

0 голосов
/ 22 ноября 2018

Я думаю, что комментарии ответили на оба моих вопроса, поэтому позвольте мне скомпоновать их в один ответ.

  1. Да, это известная ошибка, о которой сообщалось на youtrack.jetbrains.com/issue/KT-6294.Вы можете проголосовать за него (если у вас есть учетная запись Jetbrains), чтобы показать разработчикам, что вы хотели бы исправить это.Спасибо Алексею Белкову за то, что он обратил на это мое внимание.

  2. Обычный способ прямого перевода был бы:

    val br = Files.newBufferedReader(Paths.get("filename"))
    var line: String
    while (br.readLine().also { line = it} != null)
        println(line)
    

    Однако, лучший способ в этом конкретном случаеcase:

    val br = Files.newBufferedReader(Paths.get("filename"))
    br.forEachLine {
        println(it)
    }
    

    Или просто

    File("filename").forEachLine {
        println(it)
    }
    

    (который использует удобный метод, эквивалентный удобному методу Java Files.lines(Path)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...