Functional programming Kotlin索引while和lambda表示法

Functional programming Kotlin索引while和lambda表示法,functional-programming,kotlin,Functional Programming,Kotlin,我有一个JDBCResultSet(称之为rs),我想遍历它,跟踪我当前所处的迭代。为简单起见,假设我们只想在一行上打印每个索引,如以下代码段所示: var i = 0 while ( rs.next() ) { println(i++) } 我的目标是避免使用变量,并坚持更实用的风格 由于JDBC结果集不是迭代器,我不能简单地使用rs.withIndex{println(it)} 我已经实现了以下iwhile函数,它基本上满足了我的需求: tailrec fun iwhile(cond: (

我有一个JDBCResultSet(称之为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


我知道这些都是noob的问题,但是有没有一种方法可以在我写的时候使用最后一种语法呢?为什么我可以在(rs.next()){println(“hello”)}时编写
,而不是在(rs.next()){println(“hello”)}
时编写

您可以编写自己的扩展函数来提供此功能。我写这篇文章很快,所以在错误处理或日志记录方面,它可能不会做你想要的一切,但应该很接近

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
循环),并调用您提供的函数。因为您的函数是
nextWithIndex
的最后一个(也是唯一一个)参数(
fn
),所以您可以在调用它时使其看起来像我认为您最初想要的那样。

您可以编写自己的扩展函数来提供此功能。我写这篇文章很快,所以在错误处理或日志记录方面,它可能不会做你想要的一切,但应该很接近

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
循环),并调用您提供的函数。因为您的函数是
nextWithIndex
的最后一个(也是唯一一个)参数(
fn
),所以您可以在调用它时使其看起来像我认为您最初想要的那样

为什么我可以边写边写(rs.next()){println(“hello”)}而不是边写边写(rs.next()){println(“hello”)}

因为Kotlin不在乎让你实现这一点。Scala可以,在那里你可以得到这种语法

为什么我可以边写边写(rs.next()){println(“hello”)}而不是边写边写(rs.next()){println(“hello”)}


因为Kotlin不在乎让你实现这一点。Scala可以,在那里你可以得到语法。

我喜欢在这里使用扩展函数的想法。然而,我仍然对while构造的一些通用索引版本感兴趣(或者解释为什么这是不可能的):-)我喜欢在这里使用扩展函数的想法。然而,我仍然对while构造的一些通用索引版本感兴趣(或者解释为什么这是不可能的):-)您知道Apache为此创建了一个ResultTiterator类吗?可以在他们的网站()上下载,doc可以在这里找到(),这是一个非常有趣的观点,实际上是我计划使用的观点。非常感谢您的提及!您知道Apache为此创建了一个ResultSettings类吗?可以在他们的网站()上下载,doc可以在这里找到(),这是一个非常有趣的观点,实际上是我计划使用的观点。非常感谢您的提及!