gpt4 book ai didi

kotlin - 该循环的功能等效项

转载 作者:行者123 更新时间:2023-12-02 18:21:38 25 4
gpt4 key购买 nike

我正在尝试使用现代函数式语言功能重构以下函数,使其更加符合 Kotlin 习惯:

fun foobar(): List<Account> {
var pageOffset = 0
val accounts: MutableList<Account> = ArrayList()
var chunk: List<Account> = accountsService.getAccounts(pageOffset, MAX_POLL_SIZE)
while (chunk.isNotEmpty()) {
accounts.addAll(chunk)
pageOffset += MAX_POLL_SIZE
chunk = accountsService.getAccounts(pageOffset, MAX_POLL_SIZE)
}
return accounts
}

我的第一次尝试是用 buildList 替换可变列表,但它仍然不是很函数式风格:

fun foobar2(): List<Account> {
var pageOffset = 0
return buildList {
var chunk: List<Account> = accountsService.getAccounts(pageOffset, MAX_POLL_SIZE)
while (chunk.isNotEmpty()) {
addAll(chunk)
pageOffset += MAX_POLL_SIZE
chunk = accountsService.getAccounts(pageOffset, MAX_POLL_SIZE)
}
}
}

理想情况下,我想将整个 while 循环替换为 accountsService.getAccounts(...).map { ... } 但我可以'弄清楚如何重构一个 while 循环,该循环具有这种“第一个 block ”,后跟许多其他 block 。可以吗?

最佳答案

你可以这样做:

fun foobar(): List<Account> =
generateSequence(0) { it + MAX_POLL_SIZE }.map { offset ->
accountsService.getAccounts(offset, MAX_POLL_SIZE)
}.takeWhile { it.isNotEmpty() }.flatten().toList()

generateSequence 生成一个以 0 开头的无限惰性序列, MAX_POLL_SIZE , MAX_POLL_SIZE * 2 , MAX_POLL_SIZE * 3 , 等等。这是您要获取帐户的页面偏移量的序列。我们使用 map 将每个页面偏移量转换为其对应的帐户列表。 。之后,我们使用 takeWhile 指定无限序列的结束。 .

现在我们有一个Sequence<List<Account>> ,所以我们使用 flatten 将其转换为 Sequence<Account> ,然后可以简单地转换为 List<Account> ,

关于kotlin - 该循环的功能等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70800510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com