Functional programming Kotlin索引while和lambda表示法
我有一个JDBCResultSet(称之为rs),我想遍历它,跟踪我当前所处的迭代。为简单起见,假设我们只想在一行上打印每个索引,如以下代码段所示: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: (
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可以在这里找到(),这是一个非常有趣的观点,实际上是我计划使用的观点。非常感谢您的提及!