代码之家  ›  专栏  ›  技术社区  ›  DennisVA

如何对包含在Kotlin流中的列表中的元素调用方法

  •  0
  • DennisVA  · 技术社区  · 4 年前

    我想知道是否有更好的方法对流中包含的列表中的元素调用方法。目前我正在这样做,但我不喜欢调用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>>
    
    1 回复  |  直到 4 年前
        1
  •  3
  •   mightyWOZ    4 年前

    philip答案的小补充,在你的特殊情况下,你可以用 callable reference 使代码更简洁。这可以通过以下方式实现:

    .mapIterable(Transaction::asDomainModel)
    
        2
  •  2
  •   Phil Dukhov    4 年前

    我创建这个扩展也是出于同样的目的:

    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()
            }
    }