Котлин индексирует пока и лямбда-нотацию - PullRequest
0 голосов
/ 30 мая 2018

У меня есть набор результатов JDBC (назовите его rs), который я хочу просмотреть, отслеживая, в какой итерации я сейчас нахожусь.Для простоты, скажем, мы просто хотим напечатать каждый индекс в строке, как в следующем фрагменте:

var i = 0
while ( rs.next() ) { println(i++) }

Моя цель - избежать использования переменной и придерживаться более функционального стиля.

Поскольку набор результатов JDBC не является итератором, я не могу просто использовать rs.withIndex { println(it) }.

Я реализовал следующую функцию iwhile, которая в значительной степени выполняет то, что я хочу:

tailrec fun iwhile(cond: () -> Boolean, i: Int = 0, f : (Int) -> Unit): Unit {
  if (cond ()) { f(i); iwhile(cond, i + 1, f) }
}

Меня беспокоит только то, как вызвать эту функцию: мне нужно написать либо

iwhile({ rs.next() }) { println(it) }

iwhile({ rs.next() }) { i -> println(i) }

, в то время как в идеале я бы хотел написать:

iwhile ( rs.next() ) { println(i) }

Обратите внимание наотсутствие скобок вокруг предиката и имя по умолчанию i вместо it

Я знаю, что это вопросы Нуба, но есть ли способ написать в это время, чтобы я мог использовать последний синтаксис?Почему я могу написать while ( rs.next() ) { println("hello") }, а не iwhile ( rs.next() ) { println("hello") }?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Почему я могу писать в то время как (rs.next ()) {println ("hello")}, а не в то время (rs.next ()) {println ("hello")}?

Потому что Котлин не заботится о том, чтобы позволить вам этого добиться.Scala делает, и там вы можете получить этот синтаксис.

0 голосов
/ 30 мая 2018

Вы можете написать свою собственную функцию расширения, чтобы обеспечить эту функциональность.Я написал это быстро, поэтому он может не делать все, что вы хотите с точки зрения обработки ошибок или ведения журнала, но должен быть близок.

fun ResultSet.nextWithIndex(fn: (idx: Int, next: ResultSet) -> Unit): Unit {
    var index = 0
    while(this.next()) {
        fn(index, this)
        index += 1
    }
}

И для его вызова:

val rs: ResultSet = getResultSet()
rs.nextWithIndex { idx, row ->
    row.getString("this_is_a_test")
}

Что происходит, ваша функция расширения (nextWithIndex) заботится о циклическом прохождении через ResultSet (это while loop) и вызывает функцию, которую вы предоставляете.Поскольку ваша функция является последним (и единственным) аргументом (fn) для nextWithIndex, вы можете сделать так, как я думаю, вы изначально хотели, когда вы вызываете ее.

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