如何在 Kotlin Flow 中包含的列表中的元素上调用方法
How to call a method on an element within a list that is contained in a Kotlin Flow
我想知道是否有更好的方法来调用 Flow 中包含的列表中的元素的方法。目前我正在这样做,但我不喜欢调用 map() 两次:
override fun getEarnings(): Flow<List<Transaction>> {
return transactionDao.getEarnings().map {
it.map { transaction -> transaction.asDomainModel() }
}
}
transactionsDao 中定义的 getEarnings() 方法:
@Query("SELECT * FROM transactions WHERE is_income = 1")
fun getEarnings(): Flow<List<DatabaseTransaction>>
我出于同样的目的创建了这个扩展:
inline fun <T, R> Flow<Iterable<T>>.mapIterable(crossinline transform: (T) -> R): Flow<List<R>> =
map { it.map(transform) }
用法:
fun getEarnings(): Flow<List<Transaction>> {
return transactionDao
.getEarnings()
.mapIterable { transaction ->
transaction.asDomainModel()
}
}
philip 的回答的小补充,在您的特定情况下,您可以用 callable reference 替换 lambda 以使代码更简洁。这可以作为
.mapIterable(Transaction::asDomainModel)
我想知道是否有更好的方法来调用 Flow 中包含的列表中的元素的方法。目前我正在这样做,但我不喜欢调用 map() 两次:
override fun getEarnings(): Flow<List<Transaction>> {
return transactionDao.getEarnings().map {
it.map { transaction -> transaction.asDomainModel() }
}
}
transactionsDao 中定义的 getEarnings() 方法:
@Query("SELECT * FROM transactions WHERE is_income = 1")
fun getEarnings(): Flow<List<DatabaseTransaction>>
我出于同样的目的创建了这个扩展:
inline fun <T, R> Flow<Iterable<T>>.mapIterable(crossinline transform: (T) -> R): Flow<List<R>> =
map { it.map(transform) }
用法:
fun getEarnings(): Flow<List<Transaction>> {
return transactionDao
.getEarnings()
.mapIterable { transaction ->
transaction.asDomainModel()
}
}
philip 的回答的小补充,在您的特定情况下,您可以用 callable reference 替换 lambda 以使代码更简洁。这可以作为
.mapIterable(Transaction::asDomainModel)