我正在嘗試使用現代函式式語言特性重構以下函式以使其更符合 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 回圈,然后是一些進一步的塊。可以做到嗎?
uj5u.com熱心網友回復:
你可以這樣做:
fun foobar(): List<Account> =
generateSequence(0) { it MAX_POLL_SIZE }.map { offset ->
accountsService.getAccounts(offset, MAX_POLL_SIZE)
}.takeWhile { it.isNotEmpty() }.flatten().toList()
generateSequence0生成以、MAX_POLL_SIZE、MAX_POLL_SIZE * 2、等開頭的無限惰性序列MAX_POLL_SIZE * 3。這是您獲得帳戶的頁面偏移序列。我們使用 將每個頁面偏移量轉換為它對應的帳戶串列map。之后,我們使用 指定無限序列的結束takeWhile。
現在我們有了 a Sequence<List<Account>>,所以我們使用flatten將其轉換為 a Sequence<Account>,然后可以將其簡單地轉換為 a List<Account>,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/418642.html
標籤:
